itImplement a Redis publish/subscribe channel. - 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 5413e1a25d4831ded3096d8f379a9b1cfd5676ab /git/tordam/commit/5413e1a25d4831ded3096d8f379a9b1cfd5676ab.gph parazyd.org 70 1parent bbad7869cabc96604d8ababb595b21461d6e3f69 /git/tordam/commit/bbad7869cabc96604d8ababb595b21461d6e3f69.gph parazyd.org 70 hAuthor: parazyd URL:mailto:parazyd@dyne.org parazyd.org 70 iDate: Fri, 26 Oct 2018 18:24:29 +0200 Err parazyd.org 70 i Err parazyd.org 70 iImplement a Redis publish/subscribe channel. Err parazyd.org 70 i Err parazyd.org 70 iThis will be used for Gource visualizations, and will show and notify Err parazyd.org 70 iwhen nodes are added or announced again. Err parazyd.org 70 i Err parazyd.org 70 iDiffstat: Err parazyd.org 70 i M cmd/dam-dir/main.go | 9 +++++++++ Err parazyd.org 70 i M pkg/damlib/config.go | 3 +++ Err parazyd.org 70 i M pkg/damlib/redis.go | 28 +++++++++++++++++++++++++++- Err parazyd.org 70 i Err parazyd.org 70 i3 files changed, 39 insertions(+), 1 deletion(-) 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@@ -58,6 +58,11 @@ func startRedis() { Err parazyd.org 70 i Err parazyd.org 70 i _, err = lib.RedisCli.Ping().Result() Err parazyd.org 70 i lib.CheckError(err) Err parazyd.org 70 i+ Err parazyd.org 70 i+ PubSub := lib.RedisCli.Subscribe(lib.PubSubChan) Err parazyd.org 70 i+ _, err = PubSub.Receive() Err parazyd.org 70 i+ lib.CheckError(err) Err parazyd.org 70 i+ log.Printf("Created \"%s\" channel in redis\n", lib.PubSubChan) Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i func postback(rw http.ResponseWriter, data map[string]string, retCode int) error { Err parazyd.org 70 it@@ -185,12 +190,16 @@ func handlePost(rw http.ResponseWriter, request *http.Request) { Err parazyd.org 70 i if err := postback(rw, ret, 200); err != nil { Err parazyd.org 70 i lib.CheckError(err) Err parazyd.org 70 i } Err parazyd.org 70 i+ Err parazyd.org 70 i+ lib.PublishToRedis(n.Address) Err parazyd.org 70 i+ Err parazyd.org 70 i return Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i // If we have't returned so far, the handshake is invalid. Err parazyd.org 70 i log.Printf("%s: 2/2 handshake invalid.\n", n.Address) Err parazyd.org 70 i // Delete it all from redis. Err parazyd.org 70 i+ // TODO: Also pubsub here. Err parazyd.org 70 i _, err := lib.RedisCli.Del(n.Address).Result() Err parazyd.org 70 i lib.CheckError(err) Err parazyd.org 70 i if err := postback(rw, ret, 400); err != nil { Err parazyd.org 70 1diff --git a/pkg/damlib/config.go b/pkg/damlib/config.go /git/tordam/file/pkg/damlib/config.go.gph parazyd.org 70 it@@ -31,6 +31,9 @@ const RsaBits = 1024 Err parazyd.org 70 i // PrivKeyPath holds the name of where our private key is. Err parazyd.org 70 i const PrivKeyPath = "dam-private.key" Err parazyd.org 70 i Err parazyd.org 70 i+// PubSubChan is the name of the pub/sub channel we're publishing to in Redis. Err parazyd.org 70 i+const PubSubChan = "tordam" Err parazyd.org 70 i+ Err parazyd.org 70 i // PostMsg holds the message we are signing with our private key. Err parazyd.org 70 i const PostMsg = "I am a DAM node!" Err parazyd.org 70 i Err parazyd.org 70 1diff --git a/pkg/damlib/redis.go b/pkg/damlib/redis.go /git/tordam/file/pkg/damlib/redis.go.gph parazyd.org 70 it@@ -20,7 +20,11 @@ package damlib Err parazyd.org 70 i * along with this source code. If not, see . Err parazyd.org 70 i */ Err parazyd.org 70 i Err parazyd.org 70 i-import "github.com/go-redis/redis" Err parazyd.org 70 i+import ( Err parazyd.org 70 i+ "fmt" Err parazyd.org 70 i+ Err parazyd.org 70 i+ "github.com/go-redis/redis" Err parazyd.org 70 i+) Err parazyd.org 70 i Err parazyd.org 70 i // RedisAddress points us to our Redis instance. Err parazyd.org 70 i const RedisAddress = "127.0.0.1:6379" Err parazyd.org 70 it@@ -31,3 +35,25 @@ var RedisCli = redis.NewClient(&redis.Options{ Err parazyd.org 70 i Password: "", Err parazyd.org 70 i DB: 0, Err parazyd.org 70 i }) Err parazyd.org 70 i+ Err parazyd.org 70 i+// PublishToRedis is a function that publishes a node's status to Redis. Err parazyd.org 70 i+// This is used for Gource visualization. Err parazyd.org 70 i+func PublishToRedis(address string) { Err parazyd.org 70 i+ var timestamp, username, modtype, onion, pubstr string Err parazyd.org 70 i+ Err parazyd.org 70 i+ nodedata, err := RedisCli.HGetAll(address).Result() Err parazyd.org 70 i+ CheckError(err) Err parazyd.org 70 i+ Err parazyd.org 70 i+ timestamp = nodedata["lastseen"] Err parazyd.org 70 i+ if timestamp == nodedata["firstseen"] { Err parazyd.org 70 i+ modtype = "A" Err parazyd.org 70 i+ } else { Err parazyd.org 70 i+ modtype = "M" Err parazyd.org 70 i+ } Err parazyd.org 70 i+ username = address Err parazyd.org 70 i+ onion = address Err parazyd.org 70 i+ Err parazyd.org 70 i+ pubstr = fmt.Sprintf("%s|%s|%s|%s\n", timestamp, username, modtype, onion) Err parazyd.org 70 i+ Err parazyd.org 70 i+ RedisCli.Publish(PubSubChan, pubstr) Err parazyd.org 70 i+} Err parazyd.org 70 .