2020-11-08 17:19:25 +00:00
|
|
|
package http
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/anacrolix/missinggo/v2/filecache"
|
2021-03-01 16:43:28 +00:00
|
|
|
"github.com/distribyted/distribyted"
|
|
|
|
"github.com/distribyted/distribyted/config"
|
|
|
|
"github.com/distribyted/distribyted/stats"
|
2020-11-08 17:19:25 +00:00
|
|
|
"github.com/gin-contrib/static"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"github.com/shurcooL/httpfs/html/vfstemplate"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
func New(fc *filecache.Cache, ss *stats.Torrent, ch *config.Handler, port int) error {
|
|
|
|
gin.SetMode(gin.ReleaseMode)
|
|
|
|
r := gin.New()
|
|
|
|
r.Use(gin.Recovery())
|
|
|
|
r.Use(gin.ErrorLogger())
|
|
|
|
|
|
|
|
assets := distribyted.NewBinaryFileSystem(distribyted.HttpFS, "/assets")
|
|
|
|
r.Use(static.Serve("/assets", assets))
|
|
|
|
t, err := vfstemplate.ParseGlob(distribyted.HttpFS, nil, "/templates/*")
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("error parsing html: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
r.SetHTMLTemplate(t)
|
|
|
|
|
|
|
|
r.GET("/", indexHandler)
|
|
|
|
r.GET("/routes", routesHandler(ss))
|
|
|
|
r.GET("/config", configHandler)
|
|
|
|
|
2020-11-09 10:33:19 +00:00
|
|
|
eventChan := make(chan string)
|
|
|
|
|
2020-11-08 17:19:25 +00:00
|
|
|
api := r.Group("/api")
|
|
|
|
{
|
|
|
|
api.GET("/status", apiStatusHandler(fc, ss))
|
|
|
|
api.GET("/routes", apiRoutesHandler(ss))
|
|
|
|
api.GET("/config", apiGetConfigFile(ch))
|
|
|
|
api.POST("/config", apiSetConfigFile(ch))
|
2020-11-09 10:33:19 +00:00
|
|
|
api.POST("/reload", apiReloadServer(ch, eventChan))
|
|
|
|
api.GET("/events", apiStreamEvents(eventChan))
|
2020-11-08 17:19:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
logrus.WithField("host", fmt.Sprintf("0.0.0.0:%d", port)).Info("starting webserver")
|
|
|
|
|
|
|
|
if err := r.Run(fmt.Sprintf(":%d", port)); err != nil {
|
|
|
|
return fmt.Errorf("error initializing server: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|