88 lines
1.8 KiB
Go
88 lines
1.8 KiB
Go
|
package http
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"io"
|
||
|
"io/ioutil"
|
||
|
|
||
|
"github.com/ajnavarro/distribyted/config"
|
||
|
"github.com/ajnavarro/distribyted/stats"
|
||
|
"github.com/anacrolix/missinggo/v2/filecache"
|
||
|
"github.com/gin-gonic/gin"
|
||
|
)
|
||
|
|
||
|
var apiStatusHandler = func(fc *filecache.Cache, ss *stats.Torrent) gin.HandlerFunc {
|
||
|
return func(ctx *gin.Context) {
|
||
|
// TODO move to a struct
|
||
|
ctx.JSON(200, gin.H{
|
||
|
"cacheItems": fc.Info().NumItems,
|
||
|
"cacheFilled": fc.Info().Filled / 1024 / 1024,
|
||
|
"cacheCapacity": fc.Info().Capacity / 1024 / 1024,
|
||
|
"torrentStats": ss.GlobalStats(),
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var apiRoutesHandler = func(ss *stats.Torrent) gin.HandlerFunc {
|
||
|
return func(ctx *gin.Context) {
|
||
|
stats := ss.RoutesStats()
|
||
|
ctx.JSON(200, stats)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var apiGetConfigFile = func(ch *config.Handler) gin.HandlerFunc {
|
||
|
return func(ctx *gin.Context) {
|
||
|
rc, err := ch.GetRaw()
|
||
|
if err != nil {
|
||
|
ctx.AbortWithError(500, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
ctx.Data(200, "text/x-yaml", rc)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var apiSetConfigFile = func(ch *config.Handler) gin.HandlerFunc {
|
||
|
return func(ctx *gin.Context) {
|
||
|
if ctx.Request.Body == nil {
|
||
|
ctx.AbortWithError(500, errors.New("no config file sent"))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
c, err := ioutil.ReadAll(ctx.Request.Body)
|
||
|
if err != nil {
|
||
|
ctx.AbortWithError(500, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if len(c) == 0 {
|
||
|
ctx.AbortWithError(500, errors.New("no config file sent"))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if err := ch.Set(c); err != nil {
|
||
|
ctx.AbortWithError(500, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// TODO return something?
|
||
|
ctx.JSON(200, nil)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var apiReloadServer = func(ch *config.Handler) gin.HandlerFunc {
|
||
|
return func(ctx *gin.Context) {
|
||
|
ctx.Stream(func(w io.Writer) bool {
|
||
|
err := ch.Reload(
|
||
|
func(m string) {
|
||
|
ctx.SSEvent("reload", m)
|
||
|
})
|
||
|
if err != nil {
|
||
|
ctx.AbortWithError(500, err)
|
||
|
}
|
||
|
|
||
|
return false
|
||
|
})
|
||
|
}
|
||
|
}
|