Compare commits

...

7 Commits

Author SHA1 Message Date
304d22ffba updated dependencies 2025-02-13 17:58:03 +01:00
ed1a1d67fc updated dependencies 2025-02-12 13:27:39 +01:00
8687a608f6 updated dependencies 2025-02-04 22:07:45 +01:00
b8d946cd31 panic on any http error 2025-02-02 22:35:06 +01:00
51842a0656 updated dependencies 2025-02-02 20:08:39 +01:00
37072c247f updated dependencies 2025-02-02 20:05:12 +01:00
a82184ee33 refactor 2025-02-02 19:47:56 +01:00
3 changed files with 51 additions and 44 deletions

8
go.mod
View File

@ -3,11 +3,11 @@ module git.tordarus.net/tordarus/omada-bandwidth
go 1.23.5 go 1.23.5
require ( require (
git.tordarus.net/tordarus/channel v0.1.18 git.tordarus.net/tordarus/channel v0.1.19
git.tordarus.net/tordarus/envvars v0.0.0-20250114175450-d73e12b838a5 git.tordarus.net/tordarus/envvars v0.0.0-20250114175450-d73e12b838a5
git.tordarus.net/tordarus/gmath v0.0.7 git.tordarus.net/tordarus/gmath v0.0.7
git.tordarus.net/tordarus/omada-api v0.0.2 git.tordarus.net/tordarus/omada-api v0.0.10
git.tordarus.net/tordarus/slices v0.0.13 git.tordarus.net/tordarus/slices v0.0.14
) )
require git.tordarus.net/tordarus/ezhttp v0.0.3 // indirect require git.tordarus.net/tordarus/ezhttp v0.0.9 // indirect

16
go.sum
View File

@ -1,12 +1,12 @@
git.tordarus.net/tordarus/channel v0.1.18 h1:/9BDbkyXbVpFB+dQbToniX6g/ApBnzjslYt4NiycMQo= git.tordarus.net/tordarus/channel v0.1.19 h1:d9xnSwFyvBh4B1/82mt0A7Gpm2nIZJTc+9ceJMIOu5Q=
git.tordarus.net/tordarus/channel v0.1.18/go.mod h1:8/dWFTdGO7g4AeSZ7cF6GerkGbe9c4dBVMVDBxOd9m4= git.tordarus.net/tordarus/channel v0.1.19/go.mod h1:8/dWFTdGO7g4AeSZ7cF6GerkGbe9c4dBVMVDBxOd9m4=
git.tordarus.net/tordarus/envvars v0.0.0-20250114175450-d73e12b838a5 h1:rKNDX/YGunqg8TEU6q1rgS2BcDKVmUW2cg61JOE/wws= git.tordarus.net/tordarus/envvars v0.0.0-20250114175450-d73e12b838a5 h1:rKNDX/YGunqg8TEU6q1rgS2BcDKVmUW2cg61JOE/wws=
git.tordarus.net/tordarus/envvars v0.0.0-20250114175450-d73e12b838a5/go.mod h1:/qVGwrEmqtIrZyuuoIQl4vquSkPWUNJmlGNedDrdYfg= git.tordarus.net/tordarus/envvars v0.0.0-20250114175450-d73e12b838a5/go.mod h1:/qVGwrEmqtIrZyuuoIQl4vquSkPWUNJmlGNedDrdYfg=
git.tordarus.net/tordarus/ezhttp v0.0.3 h1:K6IlLmqkAFUF68HJsOTKcP3ejco7qfm+MuEagohoouo= git.tordarus.net/tordarus/ezhttp v0.0.9 h1:YwdQ4YcJwvpMw5CX5NcCEM23XQL+WCz5nWuc2dzX/84=
git.tordarus.net/tordarus/ezhttp v0.0.3/go.mod h1:Zq9o0Hibny61GqSCwJHa0PfGjVoUFv/zt2PjiQHXvmY= git.tordarus.net/tordarus/ezhttp v0.0.9/go.mod h1:Zq9o0Hibny61GqSCwJHa0PfGjVoUFv/zt2PjiQHXvmY=
git.tordarus.net/tordarus/gmath v0.0.7 h1:tR48idt9AUL0r556ww3ZxByTKJEr6NWCTlhl2ihzYxQ= git.tordarus.net/tordarus/gmath v0.0.7 h1:tR48idt9AUL0r556ww3ZxByTKJEr6NWCTlhl2ihzYxQ=
git.tordarus.net/tordarus/gmath v0.0.7/go.mod h1:mO7aPlvNrGVE9UFXEuuACjZgMDsM63l3OcQy6xSQnoE= git.tordarus.net/tordarus/gmath v0.0.7/go.mod h1:mO7aPlvNrGVE9UFXEuuACjZgMDsM63l3OcQy6xSQnoE=
git.tordarus.net/tordarus/omada-api v0.0.2 h1:Pe7tLRRyPBasEvFam6c+83A3axMcxUKgPDmAXAkJMzQ= git.tordarus.net/tordarus/omada-api v0.0.10 h1:SUxpG6HTE2meEyaEXorympNPqOQxRviBCKoOQ9fKlgY=
git.tordarus.net/tordarus/omada-api v0.0.2/go.mod h1:Ufp8hdXMyrXK7JFHq4WL1WSIlr9L6rhOBfQnqWNpXyM= git.tordarus.net/tordarus/omada-api v0.0.10/go.mod h1:+VjFQyRiDp8fKbRB6E3zfkEPm00ffnidQ1+mfVC2KUI=
git.tordarus.net/tordarus/slices v0.0.13 h1:S/6PtIxAtERwlyQvZAZZaq6RVo2kLrAsrA+19ThRRvY= git.tordarus.net/tordarus/slices v0.0.14 h1:Jy1VRMs777WewJ7mxTgjyQIMm/Zr+co18/XoQ01YZ3A=
git.tordarus.net/tordarus/slices v0.0.13/go.mod h1:RgE7A1aSAezIvPUgcbUuMHu0q4xGKoRevT+DC0eJmwI= git.tordarus.net/tordarus/slices v0.0.14/go.mod h1:RgE7A1aSAezIvPUgcbUuMHu0q4xGKoRevT+DC0eJmwI=

71
main.go
View File

@ -1,7 +1,6 @@
package main package main
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
@ -18,13 +17,14 @@ import (
var ( // flags var ( // flags
FlagSiteNames = envvars.StringSlice("SITES", ",", []string{}) FlagSiteNames = envvars.StringSlice("SITES", ",", []string{})
FlagOmadaURL = envvars.String("OMADA_URL", "http://localhost:8088") FlagOmadaURL = envvars.String("OMADA_URL", "http://localhost:8088")
FlagOmadaID = envvars.String("OMADA_ID", "") FlagOmadaID = envvars.String("OMADA_ID", "")
FlagOmadaClientID = envvars.String("OMADA_CLIENT_ID", "") FlagOmadaClientID = envvars.String("OMADA_CLIENT_ID", "")
FlagOmadaClientSecret = envvars.String("OMADA_CLIENT_SECRET", "") FlagOmadaClientSecret = envvars.String("OMADA_CLIENT_SECRET", "")
FlagOmadaUsername = envvars.String("OMADA_USERNAME", "") FlagOmadaUsername = envvars.String("OMADA_USERNAME", "")
FlagOmadaPassword = envvars.String("OMADA_PASSWORD", "") FlagOmadaPassword = envvars.String("OMADA_PASSWORD", "")
FlagRefreshInterval = envvars.Duration("REFRESH_INTERVAL", 30*time.Second) FlagRefreshInterval = envvars.Duration("REFRESH_INTERVAL", 30*time.Second)
FlagRefreshBeforeExpiration = envvars.Duration("REFRESH_BEFORE", time.Minute)
FlagHttpInterface = envvars.String("HTTP_INTERFACE", "") FlagHttpInterface = envvars.String("HTTP_INTERFACE", "")
FlagHttpPort = envvars.Uint16("HTTP_PORT", 8080) FlagHttpPort = envvars.Uint16("HTTP_PORT", 8080)
@ -50,29 +50,17 @@ func main() {
panic(err) panic(err)
} }
go func() { go StartHttpServer()
if err := api.AutoRefresh(context.Background()); err != nil {
panic(err)
}
}()
go func() { sites := slices.Ref(slices.Filter(
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { channel.ToSlice(channel.Map(api.GetSites(), channel.Result[omadamodel.Site].GetUnsafe)),
if err := json.NewEncoder(w).Encode(CurrentTraffic); err != nil { FilterSitesByName(FlagSiteNames...),
w.WriteHeader(http.StatusInternalServerError) ))
}
})
http.ListenAndServe(fmt.Sprintf("%s:%d", FlagHttpInterface, FlagHttpPort), nil)
}()
sites := slices.Filter(channel.ToSlice(api.GetSites()), FilterSitesByName(FlagSiteNames...))
ticker := time.NewTicker(FlagRefreshInterval) ticker := time.NewTicker(FlagRefreshInterval)
CalculateSiteTraffic(api, sites, 0)
lastTick := time.Now() lastTick := time.Now()
CalculateSiteTraffic(api, sites, 0)
for now := range ticker.C { for now := range ticker.C {
CurrentTraffic = CalculateSiteTraffic(api, sites, now.Sub(lastTick)) CurrentTraffic = CalculateSiteTraffic(api, sites, now.Sub(lastTick))
lastTick = now lastTick = now
@ -85,9 +73,14 @@ func CalculateSiteTraffic(api *omada.Api, sites []*omadamodel.Site, duration tim
for _, site := range sites { for _, site := range sites {
trafficByClient := map[string]TrafficRate{} trafficByClient := map[string]TrafficRate{}
clients := channel.ToSlice(api.GetClients(site.ID)) clientRequests := channel.ToSlice(api.GetClients(site.ID))
for _, client := range clients { for _, clientReq := range clientRequests {
traffic := CalculateClientTraffic(site, client, duration) client, err := clientReq.Get()
if err != nil {
panic(err)
}
traffic := CalculateClientTraffic(site, &client, duration)
trafficByClient[client.Name] = traffic trafficByClient[client.Name] = traffic
} }
@ -97,15 +90,29 @@ func CalculateSiteTraffic(api *omada.Api, sites []*omadamodel.Site, duration tim
return NewTrafficStats(siteTraffics) return NewTrafficStats(siteTraffics)
} }
func FilterSitesByName(allowedSiteNames ...string) func(site *omadamodel.Site) bool { func FilterSitesByName(allowedSiteNames ...string) func(site omadamodel.Site) bool {
if len(allowedSiteNames) == 0 { if len(allowedSiteNames) == 0 {
return func(site *omadamodel.Site) bool { return true } return func(site omadamodel.Site) bool { return true }
} }
siteNames := slices.ToStructMap(allowedSiteNames) siteNames := slices.ToStructMap(allowedSiteNames)
return func(site *omadamodel.Site) bool { return func(site omadamodel.Site) bool {
_, ok := siteNames[site.Name] _, ok := siteNames[site.Name]
return ok return ok
} }
} }
func StartHttpServer() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if err := json.NewEncoder(w).Encode(CurrentTraffic); err != nil {
w.WriteHeader(http.StatusInternalServerError)
}
})
connString := fmt.Sprintf("%s:%d", FlagHttpInterface, FlagHttpPort)
if err := http.ListenAndServe(connString, nil); err != nil {
panic(err)
}
}