itImprove logging. - 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 b28b13a0285e5459b23fc0b2ee42262f75efbf1a /git/tordam/commit/b28b13a0285e5459b23fc0b2ee42262f75efbf1a.gph parazyd.org 70 1parent a22b27bfe6cbfa02cc14b7eeaae4b90fe389eeb9 /git/tordam/commit/a22b27bfe6cbfa02cc14b7eeaae4b90fe389eeb9.gph parazyd.org 70 hAuthor: parazyd URL:mailto:parazyd@dyne.org parazyd.org 70 iDate: Sun, 21 Mar 2021 11:38:09 +0100 Err parazyd.org 70 i Err parazyd.org 70 iImprove logging. Err parazyd.org 70 i Err parazyd.org 70 iDiffstat: Err parazyd.org 70 i M announce_test.go | 1 + Err parazyd.org 70 i M cmd/tor-dam/tor-dam.go | 3 +++ Err parazyd.org 70 i M logging.go | 51 +++++++++++++++++++++++++------ Err parazyd.org 70 i M peer_announce.go | 6 +++--- Err parazyd.org 70 i M rpc_announce.go | 35 ++++++++++++++++--------------- Err parazyd.org 70 i Err parazyd.org 70 i5 files changed, 67 insertions(+), 29 deletions(-) Err parazyd.org 70 i--- Err parazyd.org 70 1diff --git a/announce_test.go b/announce_test.go /git/tordam/file/announce_test.go.gph parazyd.org 70 it@@ -33,6 +33,7 @@ func TestAnnounce(t *testing.T) { Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i Cfg.Datadir = os.TempDir() Err parazyd.org 70 i+ LogInit(os.Stdout) Err parazyd.org 70 i Err parazyd.org 70 i vals := []string{ Err parazyd.org 70 i "p7qaewjgnvnaeihhyybmoofd5avh665kr3awoxlh5rt6ox743kjdr6qd.onion:666", Err parazyd.org 70 1diff --git a/cmd/tor-dam/tor-dam.go b/cmd/tor-dam/tor-dam.go /git/tordam/file/cmd/tor-dam/tor-dam.go.gph parazyd.org 70 it@@ -91,6 +91,9 @@ func main() { Err parazyd.org 70 i var wg sync.WaitGroup Err parazyd.org 70 i var err error Err parazyd.org 70 i Err parazyd.org 70 i+ // Initialize tordam logger Err parazyd.org 70 i+ tordam.LogInit(os.Stdout) Err parazyd.org 70 i+ Err parazyd.org 70 i // Assign the global tordam data directory Err parazyd.org 70 i tordam.Cfg.Datadir = *datadir Err parazyd.org 70 i Err parazyd.org 70 1diff --git a/logging.go b/logging.go /git/tordam/file/logging.go.gph parazyd.org 70 it@@ -19,18 +19,51 @@ package tordam Err parazyd.org 70 i Err parazyd.org 70 i import ( Err parazyd.org 70 i "log" Err parazyd.org 70 i+ "os" Err parazyd.org 70 i+ "path/filepath" Err parazyd.org 70 i+ "runtime" Err parazyd.org 70 i "strings" Err parazyd.org 70 i ) Err parazyd.org 70 i Err parazyd.org 70 i-func rpcWarn(msg ...string) { Err parazyd.org 70 i- text := strings.Join(msg[1:], " ") Err parazyd.org 70 i- log.Printf("RPC warning: (%s) %s", msg[0], text) Err parazyd.org 70 i+var ( Err parazyd.org 70 i+ inte *log.Logger Err parazyd.org 70 i+ warn *log.Logger Err parazyd.org 70 i+ info *log.Logger Err parazyd.org 70 i+) Err parazyd.org 70 i+ Err parazyd.org 70 i+// LogInit is the initializer for the internal tordam logging functions. Err parazyd.org 70 i+// It should be called from programs using the library, with something like: Err parazyd.org 70 i+// tordam.LogInit(os.Stdout) Err parazyd.org 70 i+func LogInit(f *os.File) { Err parazyd.org 70 i+ inte = log.New(f, "(tordam) INTERNAL ERROR: ", log.Ldate|log.Ltime|log.Lshortfile) Err parazyd.org 70 i+ warn = log.New(f, "(tordam) WARNING: ", log.Ldate|log.Ltime) Err parazyd.org 70 i+ info = log.New(f, "(tordam) INFO: ", log.Ldate|log.Ltime) Err parazyd.org 70 i } Err parazyd.org 70 i-func rpcInfo(msg ...string) { Err parazyd.org 70 i- text := strings.Join(msg[1:], " ") Err parazyd.org 70 i- log.Printf("RPC info: (%s) %s", msg[0], text) Err parazyd.org 70 i+ Err parazyd.org 70 i+func fname() string { Err parazyd.org 70 i+ pc, _, _, _ := runtime.Caller(2) Err parazyd.org 70 i+ fn := runtime.FuncForPC(pc) Err parazyd.org 70 i+ Err parazyd.org 70 i+ var fnName string Err parazyd.org 70 i+ Err parazyd.org 70 i+ if fn == nil { Err parazyd.org 70 i+ fnName = "?()" Err parazyd.org 70 i+ } else { Err parazyd.org 70 i+ dotName := filepath.Ext(fn.Name()) Err parazyd.org 70 i+ fnName = strings.TrimLeft(dotName, ".") + "()" Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ return fnName Err parazyd.org 70 i } Err parazyd.org 70 i-func rpcInternalErr(msg ...string) { Err parazyd.org 70 i- text := strings.Join(msg[1:], " ") Err parazyd.org 70 i- log.Printf("RPC internal error: (%s) %s", msg[0], text) Err parazyd.org 70 i+ Err parazyd.org 70 i+func rpcWarn(msg string) { Err parazyd.org 70 i+ warn.Printf("%s: %s", fname(), msg) Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+func rpcInfo(msg string) { Err parazyd.org 70 i+ info.Printf("%s: %s", fname(), msg) Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+func rpcInternalErr(msg string) { Err parazyd.org 70 i+ inte.Printf("%s: %s", fname(), msg) Err parazyd.org 70 i } 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@@ -21,7 +21,7 @@ import ( Err parazyd.org 70 i "context" Err parazyd.org 70 i "crypto/ed25519" Err parazyd.org 70 i "encoding/base64" Err parazyd.org 70 i- "log" Err parazyd.org 70 i+ "fmt" Err parazyd.org 70 i "strings" Err parazyd.org 70 i Err parazyd.org 70 i "github.com/creachadair/jrpc2" Err parazyd.org 70 it@@ -33,7 +33,7 @@ import ( Err parazyd.org 70 i // success, it appends the peers received from the endpoint to the global Err parazyd.org 70 i // Peers map, which in turn also writes it to the peers db file. Err parazyd.org 70 i func Announce(onionaddr string) error { Err parazyd.org 70 i- log.Println("Announcing to", onionaddr) Err parazyd.org 70 i+ rpcInfo(fmt.Sprintf("Announcing to %s", onionaddr)) Err parazyd.org 70 i Err parazyd.org 70 i if err := ValidateOnionInternal(onionaddr); err != nil { Err parazyd.org 70 i return err Err parazyd.org 70 it@@ -104,7 +104,7 @@ func AppendPeers(p []string) error { Err parazyd.org 70 i continue Err parazyd.org 70 i } Err parazyd.org 70 i if err := ValidateOnionInternal(i); err != nil { Err parazyd.org 70 i- log.Printf("warning: received garbage peer (%v)", err) Err parazyd.org 70 i+ rpcWarn(fmt.Sprintf("received garbage peer (%v)", err)) Err parazyd.org 70 i continue Err parazyd.org 70 i } Err parazyd.org 70 i Peers[i] = Peer{} 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@@ -22,6 +22,7 @@ import ( Err parazyd.org 70 i "crypto/ed25519" Err parazyd.org 70 i "encoding/base64" Err parazyd.org 70 i "errors" Err parazyd.org 70 i+ "fmt" Err parazyd.org 70 i "strings" Err parazyd.org 70 i "time" Err parazyd.org 70 i ) Err parazyd.org 70 it@@ -59,11 +60,11 @@ func (Ann) Init(ctx context.Context, vals []string) ([]string, error) { Err parazyd.org 70 i portmap := strings.Split(vals[2], ",") Err parazyd.org 70 i Err parazyd.org 70 i if err := ValidateOnionInternal(onion); err != nil { Err parazyd.org 70 i- rpcWarn("ann.Init", err.Error()) Err parazyd.org 70 i+ rpcWarn(err.Error()) Err parazyd.org 70 i return nil, err Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i- rpcInfo("ann.Init", "got request for", onion) Err parazyd.org 70 i+ rpcInfo(fmt.Sprintf("got request for %s", onion)) Err parazyd.org 70 i Err parazyd.org 70 i var peer Peer Err parazyd.org 70 i reallySeen := false Err parazyd.org 70 it@@ -78,39 +79,39 @@ func (Ann) Init(ctx context.Context, vals []string) ([]string, error) { Err parazyd.org 70 i if reallySeen { Err parazyd.org 70 i // Peer announced to us before Err parazyd.org 70 i if len(vals) != 4 { Err parazyd.org 70 i- rpcWarn("ann.Init", "no revocation key provided") Err parazyd.org 70 i+ rpcWarn("no revocation key provided") Err parazyd.org 70 i return nil, errors.New("no revocation key provided") Err parazyd.org 70 i } Err parazyd.org 70 i revoke := vals[3] Err parazyd.org 70 i if strings.Compare(revoke, peer.PeerRevoke) != 0 { Err parazyd.org 70 i- rpcWarn("ann.Init", "revocation key doesn't match") Err parazyd.org 70 i+ rpcWarn("revocation key doesn't match") Err parazyd.org 70 i return nil, errors.New("revocation key doesn't match") Err parazyd.org 70 i } Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i pk, err := base64.StdEncoding.DecodeString(pubkey) Err parazyd.org 70 i if err != nil { Err parazyd.org 70 i- rpcWarn("ann.Init", "got invalid base64 public key") Err parazyd.org 70 i+ rpcWarn("got invalid base64 public key") Err parazyd.org 70 i return nil, errors.New("invalid base64 public key") Err parazyd.org 70 i } else if len(pk) != 32 { Err parazyd.org 70 i- rpcWarn("ann.Init", "got invalid pubkey (len != 32)") Err parazyd.org 70 i+ rpcWarn("got invalid pubkey (len != 32)") Err parazyd.org 70 i return nil, errors.New("invalid public key") Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i if err := ValidatePortmap(portmap); err != nil { Err parazyd.org 70 i- rpcWarn("ann.Init", err.Error()) Err parazyd.org 70 i+ rpcWarn(err.Error()) Err parazyd.org 70 i return nil, err Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i nonce, err := RandomGarbage(32) Err parazyd.org 70 i if err != nil { Err parazyd.org 70 i- rpcInternalErr("ann.Init", err.Error()) Err parazyd.org 70 i+ rpcInternalErr(err.Error()) Err parazyd.org 70 i return nil, errors.New("internal error") Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i newrevoke, err := RandomGarbage(128) Err parazyd.org 70 i if err != nil { Err parazyd.org 70 i- rpcInternalErr("ann.Init", err.Error()) Err parazyd.org 70 i+ rpcInternalErr(err.Error()) Err parazyd.org 70 i return nil, errors.New("internal error") Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 it@@ -151,36 +152,36 @@ func (Ann) Validate(ctx context.Context, vals []string) ([]string, error) { Err parazyd.org 70 i signature := vals[1] Err parazyd.org 70 i Err parazyd.org 70 i if err := ValidateOnionInternal(onion); err != nil { Err parazyd.org 70 i- rpcWarn("ann.Validate", err.Error()) Err parazyd.org 70 i+ rpcWarn(err.Error()) Err parazyd.org 70 i return nil, err Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i- rpcInfo("ann.Validate", "got request for", onion) Err parazyd.org 70 i+ rpcInfo(fmt.Sprintf("got request for %s", onion)) Err parazyd.org 70 i Err parazyd.org 70 i peer, ok := Peers[onion] Err parazyd.org 70 i if !ok { Err parazyd.org 70 i- rpcWarn("ann.Validate", onion, "not in peer map") Err parazyd.org 70 i+ rpcWarn(fmt.Sprintf("%s not in peer map", onion)) Err parazyd.org 70 i return nil, errors.New("this onion was not seen before") Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i if peer.Pubkey == nil || peer.Nonce == "" { Err parazyd.org 70 i- rpcWarn("ann.Validate", onion, "tried to validate before init") Err parazyd.org 70 i+ rpcWarn(fmt.Sprintf("%s tried to validate before init", onion)) Err parazyd.org 70 i return nil, errors.New("tried to validate before init") Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i sig, err := base64.StdEncoding.DecodeString(signature) Err parazyd.org 70 i if err != nil { Err parazyd.org 70 i- rpcWarn("ann.Validate", "invalid base64 signature string") Err parazyd.org 70 i+ rpcWarn("invalid base64 signature string") Err parazyd.org 70 i return nil, errors.New("invalid base64 signature string") Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i if !ed25519.Verify(peer.Pubkey, []byte(peer.Nonce), sig) { Err parazyd.org 70 i- rpcWarn("ann.Validate", "signature verification failed") Err parazyd.org 70 i+ rpcWarn("signature verification failed") Err parazyd.org 70 i // delete(Peers, onion) Err parazyd.org 70 i return nil, errors.New("signature verification failed") Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i- rpcInfo("ann.Validate", "validation success for", onion) Err parazyd.org 70 i+ rpcInfo(fmt.Sprintf("validation success for %s", onion)) Err parazyd.org 70 i Err parazyd.org 70 i var ret []string Err parazyd.org 70 i for addr, data := range Peers { Err parazyd.org 70 it@@ -194,6 +195,6 @@ 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- rpcInfo("ann.Validate", "sending back list of peers to", onion) Err parazyd.org 70 i+ rpcInfo(fmt.Sprintf("sending back list of peers to %s", onion)) Err parazyd.org 70 i return ret, nil Err parazyd.org 70 i } Err parazyd.org 70 .