]> Sergey Matveev's repositories - btrtrc.git/blobdiff - cmd/btrtrc/fifos.go
Remove FIFOs at quit
[btrtrc.git] / cmd / btrtrc / fifos.go
similarity index 62%
rename from cmd/btrtrc/list.go
rename to cmd/btrtrc/fifos.go
index 89d9614634532078a51a8aa314c4c7149fe4dfa7..09f4f56b8599e41592c97348934def833f3d7e0c 100644 (file)
@@ -1,6 +1,7 @@
 package main
 
 import (
+       "bufio"
        "encoding/hex"
        "fmt"
        "log"
@@ -16,6 +17,7 @@ import (
        "github.com/anacrolix/dht/v2"
        "github.com/anacrolix/torrent"
        "github.com/anacrolix/torrent/metainfo"
+       "github.com/anacrolix/torrent/types/infohash"
        "github.com/dustin/go-humanize"
 )
 
@@ -219,3 +221,132 @@ func fifoDHTList(c *torrent.Client) {
                time.Sleep(time.Second)
        }
 }
+
+type stringAddr string
+
+func (stringAddr) Network() string   { return "" }
+func (me stringAddr) String() string { return string(me) }
+
+func resolveTestPeers(addrs []string) (ret []torrent.PeerInfo) {
+       for _, ta := range addrs {
+               ret = append(ret, torrent.PeerInfo{Addr: stringAddr(ta)})
+       }
+       return
+}
+
+func readLinesFromFIFO(pth string) []string {
+       fd, err := os.OpenFile(pth, os.O_RDONLY, os.FileMode(0666))
+       if err != nil {
+               log.Println("OpenFile:", pth, err)
+               time.Sleep(time.Second)
+               return nil
+       }
+       var lines []string
+       scanner := bufio.NewScanner(fd)
+       for scanner.Scan() {
+               t := scanner.Text()
+               if len(t) > 0 {
+                       lines = append(lines, t)
+               }
+       }
+       fd.Close()
+       return lines
+}
+
+func fifoAdd(c *torrent.Client) {
+       pth := path.Join(FIFOsDir, "add")
+       recreateFIFO(pth)
+       for {
+               for _, what := range readLinesFromFIFO(pth) {
+                       cols := strings.Fields(what)
+                       what = cols[0]
+                       var t *torrent.Torrent
+                       var err error
+                       if strings.HasPrefix(what, "magnet:") {
+                               t, err = c.AddMagnet(what)
+                               if err != nil {
+                                       log.Println("AddMagnet:", what, err)
+                                       continue
+                               }
+                       } else {
+                               metaInfo, err := metainfo.LoadFromFile(what)
+                               if err != nil {
+                                       log.Println("LoadFromFile:", what, err)
+                                       continue
+                               }
+                               t, err = c.AddTorrent(metaInfo)
+                               if err != nil {
+                                       log.Println("AddTorrent:", what, err)
+                                       continue
+                               }
+                       }
+                       if len(cols) > 1 {
+                               t.AddPeers(resolveTestPeers(cols[1:]))
+                       }
+                       go fifoPeerList(t)
+                       go fifoFileList(t)
+                       log.Println("added:", t.InfoHash().HexString(), t.Name())
+                       go func() {
+                               <-t.GotInfo()
+                               if err = saveTorrent(t); err != nil {
+                                       log.Println("saveTorrent:", err)
+                               }
+                               txStatsLoad(t.InfoHash())
+                               t.DownloadAll()
+                       }()
+               }
+               time.Sleep(time.Second)
+       }
+}
+
+func fifoDel(c *torrent.Client) {
+       pth := path.Join(FIFOsDir, "del")
+       recreateFIFO(pth)
+       for {
+               for _, what := range readLinesFromFIFO(pth) {
+                       raw, err := hex.DecodeString(what)
+                       if err != nil {
+                               log.Println(err)
+                               continue
+                       }
+                       if len(raw) != infohash.Size {
+                               log.Println("bad length")
+                               continue
+                       }
+                       var i infohash.T
+                       copy(i[:], raw)
+                       t, ok := c.Torrent(i)
+                       if !ok {
+                               log.Println("no suck torrent", what)
+                               continue
+                       }
+                       txStatsDump(t)
+                       txStatsDel(t.InfoHash())
+                       t.Drop()
+                       for _, where := range []string{"files", "peers"} {
+                               pth := path.Join(where, t.InfoHash().HexString())
+                               os.Remove(pth)
+                               fd, err := os.Open(pth)
+                               if err == nil {
+                                       fd.Close()
+                               }
+                       }
+                       log.Println("deleted:", what, t.Name())
+               }
+               time.Sleep(time.Second)
+       }
+}
+
+func fifosPrepare() {
+       os.MkdirAll(path.Join(FIFOsDir, PeersDir), 0777)
+       os.MkdirAll(path.Join(FIFOsDir, FilesDir), 0777)
+}
+
+func fifosCleanup() {
+       os.Remove(path.Join(FIFOsDir, "list"))
+       os.Remove(path.Join(FIFOsDir, "dht"))
+       os.Remove(path.Join(FIFOsDir, "add"))
+       os.Remove(path.Join(FIFOsDir, "del"))
+       os.RemoveAll(path.Join(FIFOsDir, PeersDir))
+       os.RemoveAll(path.Join(FIFOsDir, FilesDir))
+}