itImplement polling routine for deleting expired nodes. - tordam - A library for peer discovery inside the Tor network Err parazyd.org 70 hgit clone https://git.parazyd.org/tordam URL:https://git.parazyd.org/tordam parazyd.org 70 1Log /git/tordam/log.gph parazyd.org 70 1Files /git/tordam/files.gph parazyd.org 70 1Refs /git/tordam/refs.gph parazyd.org 70 1README /git/tordam/file/README.md.gph parazyd.org 70 1LICENSE /git/tordam/file/LICENSE.gph parazyd.org 70 i--- Err parazyd.org 70 1commit 475f06264c63ca48384bbc8c0f1492fd7d4512c8 /git/tordam/commit/475f06264c63ca48384bbc8c0f1492fd7d4512c8.gph parazyd.org 70 1parent bf06d4818e02fde075fbb2748afc06b37c6ba376 /git/tordam/commit/bf06d4818e02fde075fbb2748afc06b37c6ba376.gph parazyd.org 70 hAuthor: parazyd URL:mailto:parazyd@dyne.org parazyd.org 70 iDate: Sat, 27 Oct 2018 12:49:19 +0200 Err parazyd.org 70 i Err parazyd.org 70 iImplement polling routine for deleting expired nodes. Err parazyd.org 70 i Err parazyd.org 70 iThis adds a -ttl flag that will make a polling goroutine active and make Err parazyd.org 70 iit poll all the nodes it finds in Redis. If their lastseen is more than Err parazyd.org 70 itthe TTL interval, they will be deleted. Err parazyd.org 70 i Err parazyd.org 70 iThis does not disallow them to reappear once they annouce again. Err parazyd.org 70 i Err parazyd.org 70 iDiffstat: Err parazyd.org 70 i M cmd/dam-dir/main.go | 33 +++++++++++++++++++++++++++++++ Err parazyd.org 70 i Err parazyd.org 70 i1 file changed, 33 insertions(+), 0 deletions(-) Err parazyd.org 70 i--- Err parazyd.org 70 1diff --git a/cmd/dam-dir/main.go b/cmd/dam-dir/main.go /git/tordam/file/cmd/dam-dir/main.go.gph parazyd.org 70 it@@ -27,6 +27,7 @@ import ( Err parazyd.org 70 i "net/http" Err parazyd.org 70 i "os" Err parazyd.org 70 i "os/exec" Err parazyd.org 70 i+ "strconv" Err parazyd.org 70 i "sync" Err parazyd.org 70 i "time" Err parazyd.org 70 i Err parazyd.org 70 it@@ -209,6 +210,30 @@ func handlePost(rw http.ResponseWriter, request *http.Request) { Err parazyd.org 70 i } Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i+func pollNodeTTL(interval int64) { Err parazyd.org 70 i+ for { Err parazyd.org 70 i+ log.Println("Polling redis for expired nodes") Err parazyd.org 70 i+ nodes, err := lib.RedisCli.Keys("*.onion").Result() Err parazyd.org 70 i+ lib.CheckError(err) Err parazyd.org 70 i+ now := time.Time.Unix(time.Now()) Err parazyd.org 70 i+ Err parazyd.org 70 i+ for _, i := range nodes { Err parazyd.org 70 i+ res, err := lib.RedisCli.HGet(i, "lastseen").Result() Err parazyd.org 70 i+ lib.CheckError(err) Err parazyd.org 70 i+ lastseen, err := strconv.Atoi(res) Err parazyd.org 70 i+ lib.CheckError(err) Err parazyd.org 70 i+ Err parazyd.org 70 i+ diff := int64((now - int64(lastseen)) / 60) Err parazyd.org 70 i+ if diff > interval { Err parazyd.org 70 i+ log.Printf("Deleting %s from redis because of expiration\n", i) Err parazyd.org 70 i+ // TODO: Redis pubsub Err parazyd.org 70 i+ lib.RedisCli.Del(i) Err parazyd.org 70 i+ } Err parazyd.org 70 i+ } Err parazyd.org 70 i+ time.Sleep(time.Duration(interval) * time.Minute) Err parazyd.org 70 i+ } Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i // handleElse is a noop for anything that isn't /announce. We don't care about Err parazyd.org 70 i // other requests (yet). Err parazyd.org 70 i func handleElse(rw http.ResponseWriter, request *http.Request) {} Err parazyd.org 70 it@@ -216,8 +241,10 @@ func handleElse(rw http.ResponseWriter, request *http.Request) {} Err parazyd.org 70 i func main() { Err parazyd.org 70 i var wg sync.WaitGroup Err parazyd.org 70 i var t bool Err parazyd.org 70 i+ var ttl int64 Err parazyd.org 70 i Err parazyd.org 70 i flag.BoolVar(&t, "t", false, "Mark all new nodes valid initially") Err parazyd.org 70 i+ flag.Int64Var(&ttl, "ttl", 0, "Set expiry time in minutes (TTL) for nodes") Err parazyd.org 70 i flag.Parse() Err parazyd.org 70 i Err parazyd.org 70 i if t { Err parazyd.org 70 it@@ -249,6 +276,12 @@ func main() { Err parazyd.org 70 i wg.Add(1) Err parazyd.org 70 i go srv.ListenAndServe() Err parazyd.org 70 i log.Println("Listening on", ListenAddress) Err parazyd.org 70 i+ Err parazyd.org 70 i+ if ttl > 0 { Err parazyd.org 70 i+ log.Println("Enabling TTL polling.") Err parazyd.org 70 i+ go pollNodeTTL(ttl) Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i wg.Wait() Err parazyd.org 70 i os.Exit(1) Err parazyd.org 70 i } Err parazyd.org 70 .