itImplement writing of JSON peer database file. - 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 0ca20205f1d320ec19d1b0091c5a998fbe2b6cde /git/tordam/commit/0ca20205f1d320ec19d1b0091c5a998fbe2b6cde.gph parazyd.org 70 1parent 3e58d2fb3e30da2e28c8fbc94731f64ecd645ef9 /git/tordam/commit/3e58d2fb3e30da2e28c8fbc94731f64ecd645ef9.gph parazyd.org 70 hAuthor: parazyd URL:mailto:parazyd@dyne.org parazyd.org 70 iDate: Mon, 8 Mar 2021 00:55:09 +0100 Err parazyd.org 70 i Err parazyd.org 70 iImplement writing of JSON peer database file. Err parazyd.org 70 i Err parazyd.org 70 iWe use semaphores to limit concurrency. Err parazyd.org 70 i Err parazyd.org 70 iDiffstat: Err parazyd.org 70 i M config.go | 12 ++++++++++++ Err parazyd.org 70 i A database.go | 50 +++++++++++++++++++++++++++++++ Err parazyd.org 70 i M go.mod | 1 + Err parazyd.org 70 i M go.sum | 2 ++ Err parazyd.org 70 i M peer_announce.go | 2 ++ Err parazyd.org 70 i M rpc_announce.go | 3 +++ Err parazyd.org 70 i Err parazyd.org 70 i6 files changed, 70 insertions(+), 0 deletions(-) Err parazyd.org 70 i--- Err parazyd.org 70 1diff --git a/config.go b/config.go /git/tordam/file/config.go.gph parazyd.org 70 it@@ -18,8 +18,11 @@ Err parazyd.org 70 i package tordam Err parazyd.org 70 i Err parazyd.org 70 i import ( Err parazyd.org 70 i+ "context" Err parazyd.org 70 i "crypto/ed25519" Err parazyd.org 70 i "net" Err parazyd.org 70 i+ Err parazyd.org 70 i+ "golang.org/x/sync/semaphore" Err parazyd.org 70 i ) Err parazyd.org 70 i Err parazyd.org 70 i // Config is the configuration structure, to be filled by library user. Err parazyd.org 70 it@@ -42,3 +45,12 @@ var Cfg = Config{} Err parazyd.org 70 i Err parazyd.org 70 i // Peers is the global map of peers Err parazyd.org 70 i var Peers = map[string]Peer{} Err parazyd.org 70 i+ Err parazyd.org 70 i+// dbSem is the internal semaphore for writing the peer db Err parazyd.org 70 i+var dbSem = semaphore.NewWeighted(1) Err parazyd.org 70 i+ Err parazyd.org 70 i+// dbSemCtx is the context for dbSem Err parazyd.org 70 i+var dbSemCtx = context.Background() Err parazyd.org 70 i+ Err parazyd.org 70 i+// dbFile is the filename for the Peers JSON database Err parazyd.org 70 i+var dbFile = "peers.json" Err parazyd.org 70 1diff --git a/database.go b/database.go /git/tordam/file/database.go.gph parazyd.org 70 it@@ -0,0 +1,50 @@ Err parazyd.org 70 i+// Copyright (c) 2017-2021 Ivan Jelincic Err parazyd.org 70 i+// Err parazyd.org 70 i+// This file is part of tordam Err parazyd.org 70 i+// Err parazyd.org 70 i+// This program is free software: you can redistribute it and/or modify Err parazyd.org 70 i+// it under the terms of the GNU Affero General Public License as published by Err parazyd.org 70 i+// the Free Software Foundation, either version 3 of the License, or Err parazyd.org 70 i+// (at your option) any later version. Err parazyd.org 70 i+// Err parazyd.org 70 i+// This program is distributed in the hope that it will be useful, Err parazyd.org 70 i+// but WITHOUT ANY WARRANTY; without even the implied warranty of Err parazyd.org 70 i+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Err parazyd.org 70 i+// GNU Affero General Public License for more details. Err parazyd.org 70 i+// Err parazyd.org 70 i+// You should have received a copy of the GNU Affero General Public License Err parazyd.org 70 i+// along with this program. If not, see . Err parazyd.org 70 i+ Err parazyd.org 70 i+package tordam Err parazyd.org 70 i+ Err parazyd.org 70 i+import ( Err parazyd.org 70 i+ "encoding/json" Err parazyd.org 70 i+ "io/ioutil" Err parazyd.org 70 i+ "log" Err parazyd.org 70 i+) Err parazyd.org 70 i+ Err parazyd.org 70 i+// WritePeersDB marshals the Peers global to JSON and writes to given file. Err parazyd.org 70 i+// Please note that this should be probably used in conjuction with a semaphore. Err parazyd.org 70 i+func WritePeersDB(file string) error { Err parazyd.org 70 i+ j, err := json.Marshal(Peers) Err parazyd.org 70 i+ if err != nil { Err parazyd.org 70 i+ return err Err parazyd.org 70 i+ } Err parazyd.org 70 i+ return ioutil.WriteFile(file, j, 0600) Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+// writePeersDBWithSem is an internal function to call WritePeersDB safely Err parazyd.org 70 i+// using an internal semafore. Programs using this library should probably Err parazyd.org 70 i+// implement something similar. Err parazyd.org 70 i+func writePeersDBWithSem(file string) { Err parazyd.org 70 i+ if err := dbSem.Acquire(dbSemCtx, 1); err != nil { Err parazyd.org 70 i+ log.Println("warning: failed to acquire sem for writing:", err) Err parazyd.org 70 i+ return Err parazyd.org 70 i+ } Err parazyd.org 70 i+ go func() { Err parazyd.org 70 i+ if err := WritePeersDB(file); err != nil { Err parazyd.org 70 i+ log.Println("warning: failed to write peers db:", err) Err parazyd.org 70 i+ } Err parazyd.org 70 i+ dbSem.Release(1) Err parazyd.org 70 i+ }() Err parazyd.org 70 i+} Err parazyd.org 70 1diff --git a/go.mod b/go.mod /git/tordam/file/go.mod.gph parazyd.org 70 it@@ -5,4 +5,5 @@ go 1.16 Err parazyd.org 70 i require ( Err parazyd.org 70 i github.com/creachadair/jrpc2 v0.12.0 Err parazyd.org 70 i golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 Err parazyd.org 70 i+ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect Err parazyd.org 70 i ) Err parazyd.org 70 1diff --git a/go.sum b/go.sum /git/tordam/file/go.sum.gph parazyd.org 70 it@@ -11,6 +11,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxW Err parazyd.org 70 i golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= Err parazyd.org 70 i golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= Err parazyd.org 70 i golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= Err parazyd.org 70 i+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= Err parazyd.org 70 i+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= Err parazyd.org 70 i golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= Err parazyd.org 70 i golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= Err parazyd.org 70 i golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= Err parazyd.org 70 1diff --git a/peer_announce.go b/peer_announce.go /git/tordam/file/peer_announce.go.gph parazyd.org 70 it@@ -105,5 +105,7 @@ func AppendPeers(p []string) error { Err parazyd.org 70 i } Err parazyd.org 70 i Peers[i] = Peer{} Err parazyd.org 70 i } Err parazyd.org 70 i+ Err parazyd.org 70 i+ writePeersDBWithSem(strings.Join([]string{Cfg.Datadir, dbFile}, "/")) Err parazyd.org 70 i return nil Err parazyd.org 70 i } Err parazyd.org 70 1diff --git a/rpc_announce.go b/rpc_announce.go /git/tordam/file/rpc_announce.go.gph parazyd.org 70 it@@ -122,6 +122,7 @@ func (Ann) Init(ctx context.Context, vals []string) ([]string, error) { Err parazyd.org 70 i peer.Trusted = 0 Err parazyd.org 70 i Peers[onion] = peer Err parazyd.org 70 i Err parazyd.org 70 i+ writePeersDBWithSem(strings.Join([]string{Cfg.Datadir, dbFile}, "/")) Err parazyd.org 70 i return []string{nonce, newrevoke}, nil Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 it@@ -194,6 +195,8 @@ func (Ann) Validate(ctx context.Context, vals []string) ([]string, error) { Err parazyd.org 70 i peer.LastSeen = time.Now().Unix() Err parazyd.org 70 i Peers[onion] = peer Err parazyd.org 70 i Err parazyd.org 70 i+ writePeersDBWithSem(strings.Join([]string{Cfg.Datadir, dbFile}, "/")) Err parazyd.org 70 i+ Err parazyd.org 70 i rpcInfo("ann.Validate", "sending back list of peers to", onion) Err parazyd.org 70 i return ret, nil Err parazyd.org 70 i } Err parazyd.org 70 .