Skip to content

Commit

Permalink
api/erebrus: add stats in get requests, add server speed api
Browse files Browse the repository at this point in the history
  • Loading branch information
inciner8r committed Jan 18, 2024
1 parent 3679d14 commit f5304a5
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 12 deletions.
13 changes: 12 additions & 1 deletion api/v1/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/NetSepio/erebrus/core"
"github.com/NetSepio/erebrus/model"
"github.com/NetSepio/erebrus/util"
"github.com/NetSepio/erebrus/util/pkg/speedtest"

"github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
Expand All @@ -19,7 +20,7 @@ func ApplyRoutes(r *gin.RouterGroup) {
g.GET("", readServer)
g.PATCH("", updateServer)
g.GET("/config", configServer)

g.GET("/speed", getServerSpeed)
}
}

Expand Down Expand Up @@ -101,3 +102,13 @@ func configServer(c *gin.Context) {
c.Header("Content-Disposition", "attachment; filename="+os.Getenv("WG_INTERFACE_NAME")+"")
c.Data(http.StatusOK, "application/config", configData)
}

func getServerSpeed(c *gin.Context) {
res, err := speedtest.GetSpeedtestResults()
if err != nil {
log.WithFields(util.StandardFields).Error("Failed to read server speed")
c.AbortWithStatus(http.StatusInternalServerError)
return
}
c.JSON(http.StatusOK, res)
}
22 changes: 21 additions & 1 deletion core/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/NetSepio/erebrus/storage"
"github.com/NetSepio/erebrus/template"
"github.com/NetSepio/erebrus/util"
"github.com/NetSepio/erebrus/util/pkg/stats"
uuid "github.com/google/uuid"
log "github.com/sirupsen/logrus"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
Expand Down Expand Up @@ -84,6 +85,15 @@ func ReadClient(id string) (*model.Client, error) {
return nil, err
}
client := v.(*model.Client)
pkey := client.PublicKey
clientStats, err := stats.GetWireGuardStatsForPeer(pkey)
if err != nil {
log.WithFields(log.Fields{
"err": err,
}).Error("failed to get client stats")
}
client.ReceiveBytes = clientStats.ReceivedBytes
client.TransmitBytes = clientStats.TransmittedBytes

return client, nil
}
Expand Down Expand Up @@ -163,7 +173,17 @@ func ReadClients() ([]*model.Client, error) {
"path": f.Name(),
}).Error("failed to deserialize client")
} else {
clients = append(clients, c.(*model.Client))
cl := c.(*model.Client)
pkey := cl.PublicKey
clientStats, err := stats.GetWireGuardStatsForPeer(pkey)
if err != nil {
log.WithFields(log.Fields{
"err": err,
}).Error("failed to get client stats")
}
cl.ReceiveBytes = clientStats.ReceivedBytes
cl.TransmitBytes = clientStats.TransmittedBytes
clients = append(clients, cl)
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions model/model.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 16 additions & 8 deletions util/pkg/speedtest/speedtest.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,37 @@ import (
"os/exec"
)

func GetSpeedtestResults() (downloadSpeed, uploadSpeed float64, err error) {
type SpeedtestResult struct {
DownloadSpeed float64 `json:"downloadSpeed"`
UploadSpeed float64 `json:"uploadSpeed"`
}

func GetSpeedtestResults() (res *SpeedtestResult, err error) {
cmd := exec.Command("speedtest", "--json")

output, err := cmd.CombinedOutput()
if err != nil {
return 0, 0, fmt.Errorf("failed to execute 'speedtest --json': %v", err)
return nil, fmt.Errorf("failed to execute 'speedtest --json': %v", err)
}

// Parse the Speedtest results
var result map[string]interface{}
if err := json.Unmarshal(output, &result); err != nil {
return 0, 0, fmt.Errorf("failed to parse Speedtest results: %v", err)
return nil, fmt.Errorf("failed to parse Speedtest results: %v", err)
}

downloadSpeed, ok := result["download"].(float64)
if !ok {
return 0, 0, fmt.Errorf("download speed not found in Speedtest results")
return nil, fmt.Errorf("download speed not found in Speedtest results")
}

uploadSpeed, ok = result["upload"].(float64)
uploadSpeed, ok := result["upload"].(float64)
if !ok {
return 0, 0, fmt.Errorf("upload speed not found in Speedtest results")
return nil, fmt.Errorf("upload speed not found in Speedtest results")
}

return downloadSpeed, uploadSpeed, nil
response := &SpeedtestResult{
DownloadSpeed: downloadSpeed,
UploadSpeed: uploadSpeed,
}
return response, nil
}

0 comments on commit f5304a5

Please sign in to comment.