From c1ad177746f196a3951846a1857f05145d1ce04f Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Mon, 28 Nov 2022 11:31:22 +0300 Subject: [PATCH] Remove FIFOs at quit --- cmd/btrtrc/add.go | 130 ------------------------------ cmd/btrtrc/{list.go => fifos.go} | 131 +++++++++++++++++++++++++++++++ cmd/btrtrc/main.go | 5 +- 3 files changed, 133 insertions(+), 133 deletions(-) delete mode 100644 cmd/btrtrc/add.go rename cmd/btrtrc/{list.go => fifos.go} (62%) diff --git a/cmd/btrtrc/add.go b/cmd/btrtrc/add.go deleted file mode 100644 index 812176a5..00000000 --- a/cmd/btrtrc/add.go +++ /dev/null @@ -1,130 +0,0 @@ -package main - -import ( - "bufio" - "encoding/hex" - "log" - "os" - "path" - "strings" - "time" - - "github.com/anacrolix/torrent" - "github.com/anacrolix/torrent/metainfo" - "github.com/anacrolix/torrent/types/infohash" -) - -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) - } -} diff --git a/cmd/btrtrc/list.go b/cmd/btrtrc/fifos.go similarity index 62% rename from cmd/btrtrc/list.go rename to cmd/btrtrc/fifos.go index 89d96146..09f4f56b 100644 --- a/cmd/btrtrc/list.go +++ b/cmd/btrtrc/fifos.go @@ -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)) +} diff --git a/cmd/btrtrc/main.go b/cmd/btrtrc/main.go index eb5afaab..26dafe23 100644 --- a/cmd/btrtrc/main.go +++ b/cmd/btrtrc/main.go @@ -7,7 +7,6 @@ import ( "net" "os" "os/signal" - "path" "strings" "syscall" @@ -86,8 +85,7 @@ func main() { client.Close() }() - os.MkdirAll(path.Join(FIFOsDir, PeersDir), 0777) - os.MkdirAll(path.Join(FIFOsDir, FilesDir), 0777) + fifosPrepare() log.Println("started", client.PublicIPs()) go overallStatus(client, overallStatusCancel) go fifoList(client) @@ -98,5 +96,6 @@ func main() { <-client.Closed() <-overallStatusCancel <-txStatsDumperCancel + fifosCleanup() log.Println("finished") } -- 2.44.0