Compare commits

..

4 Commits

Author SHA1 Message Date
8bf2e7b687 remove debug logs and panic if auto refresh failed 2025-02-02 10:59:05 +01:00
1fd0ecc167 use AutoRefresh to refresh accessToken 2025-02-02 10:56:30 +01:00
a3c8c3ad59 added logging 2025-02-02 02:35:05 +01:00
64de05523e show pre-formatted values 2025-02-01 21:15:53 +01:00
5 changed files with 51 additions and 34 deletions

View File

@ -14,10 +14,10 @@ func CalculateClientTraffic(site *omadamodel.Site, client *omadamodel.Client, du
ClientMac: client.MacAddress, ClientMac: client.MacAddress,
} }
trafficTotal := TrafficRate{ trafficTotal := MakeTrafficRate(
Received: uint64(client.TrafficDownBytes), uint64(client.TrafficDownBytes),
Transferred: uint64(client.TrafficUpBytes), uint64(client.TrafficUpBytes),
} )
defer func() { defer func() {
TrafficByClient[uniqueID] = trafficTotal TrafficByClient[uniqueID] = trafficTotal
@ -26,14 +26,14 @@ func CalculateClientTraffic(site *omadamodel.Site, client *omadamodel.Client, du
lastTotal, ok := TrafficByClient[uniqueID] lastTotal, ok := TrafficByClient[uniqueID]
if !ok { if !ok {
return TrafficRate{} return MakeTrafficRate(0, 0)
} }
trafficInDur := trafficTotal.Sub(lastTotal) trafficInDur := trafficTotal.Sub(lastTotal)
seconds := duration.Seconds() seconds := duration.Seconds()
return TrafficRate{ return MakeTrafficRate(
Received: uint64(float64(trafficInDur.Received) / seconds), uint64(float64(trafficInDur.Received)/seconds),
Transferred: uint64(float64(trafficInDur.Transferred) / seconds), uint64(float64(trafficInDur.Transferred)/seconds),
} )
} }

2
go.mod
View File

@ -6,7 +6,7 @@ require (
git.tordarus.net/tordarus/channel v0.1.18 git.tordarus.net/tordarus/channel v0.1.18
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.1 git.tordarus.net/tordarus/omada-api v0.0.2
git.tordarus.net/tordarus/slices v0.0.13 git.tordarus.net/tordarus/slices v0.0.13
) )

4
go.sum
View File

@ -6,7 +6,7 @@ git.tordarus.net/tordarus/ezhttp v0.0.3 h1:K6IlLmqkAFUF68HJsOTKcP3ejco7qfm+MuEag
git.tordarus.net/tordarus/ezhttp v0.0.3/go.mod h1:Zq9o0Hibny61GqSCwJHa0PfGjVoUFv/zt2PjiQHXvmY= git.tordarus.net/tordarus/ezhttp v0.0.3/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.1 h1:w4WozETL00JygidOXGkGs9UxUQhUNlNnlfqWiYYriHo= git.tordarus.net/tordarus/omada-api v0.0.2 h1:Pe7tLRRyPBasEvFam6c+83A3axMcxUKgPDmAXAkJMzQ=
git.tordarus.net/tordarus/omada-api v0.0.1/go.mod h1:Ufp8hdXMyrXK7JFHq4WL1WSIlr9L6rhOBfQnqWNpXyM= git.tordarus.net/tordarus/omada-api v0.0.2/go.mod h1:Ufp8hdXMyrXK7JFHq4WL1WSIlr9L6rhOBfQnqWNpXyM=
git.tordarus.net/tordarus/slices v0.0.13 h1:S/6PtIxAtERwlyQvZAZZaq6RVo2kLrAsrA+19ThRRvY= git.tordarus.net/tordarus/slices v0.0.13 h1:S/6PtIxAtERwlyQvZAZZaq6RVo2kLrAsrA+19ThRRvY=
git.tordarus.net/tordarus/slices v0.0.13/go.mod h1:RgE7A1aSAezIvPUgcbUuMHu0q4xGKoRevT+DC0eJmwI= git.tordarus.net/tordarus/slices v0.0.13/go.mod h1:RgE7A1aSAezIvPUgcbUuMHu0q4xGKoRevT+DC0eJmwI=

13
main.go
View File

@ -1,6 +1,7 @@
package main package main
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
@ -9,7 +10,7 @@ import (
"git.tordarus.net/tordarus/channel" "git.tordarus.net/tordarus/channel"
"git.tordarus.net/tordarus/envvars" "git.tordarus.net/tordarus/envvars"
"git.tordarus.net/tordarus/gmath" "git.tordarus.net/tordarus/gmath"
omadaapi "git.tordarus.net/tordarus/omada-api" omada "git.tordarus.net/tordarus/omada-api"
omadamodel "git.tordarus.net/tordarus/omada-api/model" omadamodel "git.tordarus.net/tordarus/omada-api/model"
"git.tordarus.net/tordarus/slices" "git.tordarus.net/tordarus/slices"
) )
@ -36,7 +37,7 @@ var CurrentTraffic = &TrafficStats{}
func main() { func main() {
FlagRefreshInterval = gmath.Max(FlagRefreshInterval, MinRefreshInterval) FlagRefreshInterval = gmath.Max(FlagRefreshInterval, MinRefreshInterval)
api, err := omadaapi.NewApi(omadaapi.ApiConfig{ api, err := omada.NewApi(omada.ApiConfig{
BasePath: FlagOmadaURL, BasePath: FlagOmadaURL,
OmadaID: FlagOmadaID, OmadaID: FlagOmadaID,
ClientID: FlagOmadaClientID, ClientID: FlagOmadaClientID,
@ -49,6 +50,12 @@ func main() {
panic(err) panic(err)
} }
go func() {
if err := api.AutoRefresh(context.Background()); err != nil {
panic(err)
}
}()
go func() { go func() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if err := json.NewEncoder(w).Encode(CurrentTraffic); err != nil { if err := json.NewEncoder(w).Encode(CurrentTraffic); err != nil {
@ -72,7 +79,7 @@ func main() {
} }
} }
func CalculateSiteTraffic(api *omadaapi.Api, sites []*omadamodel.Site, duration time.Duration) *TrafficStats { func CalculateSiteTraffic(api *omada.Api, sites []*omadamodel.Site, duration time.Duration) *TrafficStats {
siteTraffics := map[string]*SiteTraffic{} siteTraffics := map[string]*SiteTraffic{}
for _, site := range sites { for _, site := range sites {

View File

@ -16,20 +16,32 @@ type ClientUniqueID struct {
type TrafficRate struct { type TrafficRate struct {
Received uint64 `json:"received"` // bytes per second Received uint64 `json:"received"` // bytes per second
Transferred uint64 `json:"transferred"` // bytes per second Transferred uint64 `json:"transferred"` // bytes per second
ReceivedFormatted string `json:"received_fmt"`
TransferredFormatted string `json:"transferred_fmt"`
}
func MakeTrafficRate(received, transferred uint64) TrafficRate {
return TrafficRate{
Received: received,
Transferred: transferred,
ReceivedFormatted: FormatBytesPerSecond(received),
TransferredFormatted: FormatBytesPerSecond(transferred),
}
} }
func (tr TrafficRate) Add(o TrafficRate) TrafficRate { func (tr TrafficRate) Add(o TrafficRate) TrafficRate {
return TrafficRate{ return MakeTrafficRate(
Received: tr.Received + o.Received, tr.Received+o.Received,
Transferred: tr.Transferred + o.Transferred, tr.Transferred+o.Transferred,
} )
} }
func (tr TrafficRate) Sub(o TrafficRate) TrafficRate { func (tr TrafficRate) Sub(o TrafficRate) TrafficRate {
return TrafficRate{ return MakeTrafficRate(
Received: tr.Received - o.Received, tr.Received-o.Received,
Transferred: tr.Transferred - o.Transferred, tr.Transferred-o.Transferred,
} )
} }
type SiteTraffic struct { type SiteTraffic struct {
@ -38,7 +50,7 @@ type SiteTraffic struct {
} }
func NewSiteTraffic(clients map[string]TrafficRate) *SiteTraffic { func NewSiteTraffic(clients map[string]TrafficRate) *SiteTraffic {
total := TrafficRate{} total := MakeTrafficRate(0, 0)
for _, rate := range clients { for _, rate := range clients {
total = total.Add(rate) total = total.Add(rate)
} }
@ -55,7 +67,7 @@ type TrafficStats struct {
} }
func NewTrafficStats(sites map[string]*SiteTraffic) *TrafficStats { func NewTrafficStats(sites map[string]*SiteTraffic) *TrafficStats {
total := TrafficRate{} total := MakeTrafficRate(0, 0)
for _, siteTraffic := range sites { for _, siteTraffic := range sites {
total = total.Add(siteTraffic.Total) total = total.Add(siteTraffic.Total)
} }
@ -67,7 +79,7 @@ func NewTrafficStats(sites map[string]*SiteTraffic) *TrafficStats {
} }
func (tr TrafficRate) String() string { func (tr TrafficRate) String() string {
return fmt.Sprintf("Rx: %s | Tx: %s", FormatBytes(tr.Received), FormatBytes(tr.Transferred)) return fmt.Sprintf("Rx: %s | Tx: %s", FormatBytesPerSecond(tr.Received), FormatBytesPerSecond(tr.Transferred))
} }
func (stats TrafficStats) String() string { func (stats TrafficStats) String() string {
@ -75,18 +87,16 @@ func (stats TrafficStats) String() string {
return string(data) return string(data)
} }
func FormatBytes[T gmath.Integer](bytes T) string { func FormatBytesPerSecond[T gmath.Integer](bytes T) string {
value := float64(bytes) value := float64(bytes)
if value >= 1000000000000 { if value >= 1000000000 {
return fmt.Sprintf("%.02fT", value/1000000000000) return fmt.Sprintf("%.1f GB/s", value/1000000000)
} else if value >= 1000000000 {
return fmt.Sprintf("%.02fG", value/1000000000)
} else if value >= 1000000 { } else if value >= 1000000 {
return fmt.Sprintf("%.02fM", value/1000000) return fmt.Sprintf("%.1f MB/s", value/1000000)
} else if value >= 1000 { } else if value >= 1000 {
return fmt.Sprintf("%.02fK", value/1000) return fmt.Sprintf("%.0f kB/s", value/1000)
} else { } else {
return fmt.Sprintf("%.02fB", value) return fmt.Sprintf("%.0f B/s", value)
} }
} }