109 lines
2.2 KiB
Go
109 lines
2.2 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"io/ioutil"
|
||
|
"log"
|
||
|
"os"
|
||
|
"os/signal"
|
||
|
"syscall"
|
||
|
|
||
|
"github.com/ajnavarro/distribyted/config"
|
||
|
"github.com/ajnavarro/distribyted/mount"
|
||
|
"github.com/anacrolix/missinggo/v2/filecache"
|
||
|
"github.com/anacrolix/torrent"
|
||
|
"github.com/anacrolix/torrent/storage"
|
||
|
"github.com/gin-gonic/gin"
|
||
|
"github.com/goccy/go-yaml"
|
||
|
"github.com/panjf2000/ants/v2"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
var configPath string
|
||
|
if len(os.Args) < 2 {
|
||
|
configPath = "./config.yaml"
|
||
|
} else {
|
||
|
configPath = os.Args[1]
|
||
|
}
|
||
|
|
||
|
f, err := ioutil.ReadFile(configPath)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
conf := &config.Root{}
|
||
|
if err := yaml.Unmarshal(f, conf); err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
conf = config.AddDefaults(conf)
|
||
|
|
||
|
if err := os.MkdirAll(conf.MetadataFolder, 0770); err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
fc, err := filecache.NewCache(conf.MetadataFolder)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
fc.SetCapacity(conf.MaxCacheSize * 1024 * 1024)
|
||
|
st := storage.NewResourcePieces(fc.AsResourceProvider())
|
||
|
|
||
|
// TODO download and upload limits
|
||
|
torrentCfg := torrent.NewDefaultClientConfig()
|
||
|
torrentCfg.Seed = true
|
||
|
torrentCfg.DisableTCP = true
|
||
|
torrentCfg.DefaultStorage = st
|
||
|
|
||
|
c, err := torrent.NewClient(torrentCfg)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
pool, err := ants.NewPool(100)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
mountService := mount.NewService(c, pool)
|
||
|
|
||
|
sigChan := make(chan os.Signal)
|
||
|
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
|
||
|
|
||
|
go func() {
|
||
|
<-sigChan
|
||
|
log.Println("Closing torrent client...")
|
||
|
c.Close()
|
||
|
log.Println("Releasing execution pool...")
|
||
|
pool.Release()
|
||
|
log.Println("Unmounting fuse filesystem...")
|
||
|
mountService.Close()
|
||
|
|
||
|
log.Println("Exiting...")
|
||
|
os.Exit(1)
|
||
|
}()
|
||
|
|
||
|
for _, mp := range conf.MountPoints {
|
||
|
if err := mountService.Mount(mp); err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
r := gin.Default()
|
||
|
|
||
|
r.GET("/", func(ctx *gin.Context) {
|
||
|
ctx.JSON(200, gin.H{
|
||
|
"torrentNum": len(c.Torrents()),
|
||
|
"cacheItems": fc.Info().NumItems,
|
||
|
"cacheFilled": fc.Info().Filled / 1024 / 1024,
|
||
|
"cacheCapacity": fc.Info().Capacity / 1024 / 1024,
|
||
|
"poolCap": pool.Cap(),
|
||
|
"poolFree": pool.Free(),
|
||
|
})
|
||
|
})
|
||
|
|
||
|
if err := r.Run(":4444"); err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
}
|