Superhappyfuntimelogging.
This commit is contained in:
parent
20040a6444
commit
e2ba6efad2
24
btc-crawl.go
24
btc-crawl.go
|
@ -1,10 +1,14 @@
|
||||||
// TODO: Export to a reasonable format.
|
// TODO: Export to a reasonable format.
|
||||||
// TODO: Use proper logger for logging.
|
// TODO: Namespace packages properly (outside of `main`)
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/jessevdk/go-flags"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/alexcesaro/log"
|
||||||
|
"github.com/alexcesaro/log/golog"
|
||||||
|
"github.com/jessevdk/go-flags"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Taken from: https://github.com/bitcoin/bitcoin/blob/89d72f3d9b6e7ef051ad1439f266b809f348229b/src/chainparams.cpp#L143
|
// Taken from: https://github.com/bitcoin/bitcoin/blob/89d72f3d9b6e7ef051ad1439f266b809f348229b/src/chainparams.cpp#L143
|
||||||
|
@ -25,6 +29,12 @@ type Options struct {
|
||||||
PeerAge time.Duration `long:"peer-age" description:"Ignore discovered peers older than this." default:"24h"`
|
PeerAge time.Duration `long:"peer-age" description:"Ignore discovered peers older than this." default:"24h"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var logLevels = []log.Level{
|
||||||
|
log.Warning,
|
||||||
|
log.Info,
|
||||||
|
log.Debug,
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
options := Options{}
|
options := Options{}
|
||||||
parser := flags.NewParser(&options, flags.Default)
|
parser := flags.NewParser(&options, flags.Default)
|
||||||
|
@ -35,8 +45,16 @@ func main() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
seedNodes := options.Seed
|
// Figure out the log level
|
||||||
|
numVerbose := len(options.Verbose)
|
||||||
|
if numVerbose > len(logLevels) { // lol math.Min, you floaty bugger.
|
||||||
|
numVerbose = len(logLevels)
|
||||||
|
}
|
||||||
|
|
||||||
|
logLevel := logLevels[numVerbose]
|
||||||
|
logger = golog.New(os.Stderr, logLevel)
|
||||||
|
|
||||||
|
seedNodes := options.Seed
|
||||||
if len(seedNodes) == 0 {
|
if len(seedNodes) == 0 {
|
||||||
seedNodes = GetSeedsFromDNS(defaultDnsSeeds)
|
seedNodes = GetSeedsFromDNS(defaultDnsSeeds)
|
||||||
}
|
}
|
||||||
|
|
17
crawler.go
17
crawler.go
|
@ -2,7 +2,6 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/conformal/btcwire"
|
"github.com/conformal/btcwire"
|
||||||
"log"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -44,20 +43,20 @@ func (c *Crawler) handleAddress(address string) *[]string {
|
||||||
|
|
||||||
err := peer.Connect()
|
err := peer.Connect()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[%s] Connection failed: %v", address, err)
|
logger.Debugf("[%s] Connection failed: %v", address, err)
|
||||||
return &r
|
return &r
|
||||||
}
|
}
|
||||||
defer peer.Disconnect()
|
defer peer.Disconnect()
|
||||||
|
|
||||||
err = peer.Handshake()
|
err = peer.Handshake()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[%s] Handsake failed: %v", address, err)
|
logger.Debugf("[%s] Handsake failed: %v", address, err)
|
||||||
return &r
|
return &r
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send getaddr.
|
// Send getaddr.
|
||||||
if err := btcwire.WriteMessage(peer.conn, btcwire.NewMsgGetAddr(), client.pver, client.btcnet); err != nil {
|
if err := btcwire.WriteMessage(peer.conn, btcwire.NewMsgGetAddr(), client.pver, client.btcnet); err != nil {
|
||||||
log.Printf("[%s] GetAddr failed: %v", address, err)
|
logger.Warningf("[%s] GetAddr failed: %v", address, err)
|
||||||
return &r
|
return &r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,7 +72,7 @@ func (c *Crawler) handleAddress(address string) *[]string {
|
||||||
// many unrelated messages.
|
// many unrelated messages.
|
||||||
msg, _, err := btcwire.ReadMessage(peer.conn, client.pver, client.btcnet)
|
msg, _, err := btcwire.ReadMessage(peer.conn, client.pver, client.btcnet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[%s] Failed to read message: %v", address, err)
|
logger.Warningf("[%s] Failed to read message: %v", address, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +94,7 @@ func (c *Crawler) handleAddress(address string) *[]string {
|
||||||
default:
|
default:
|
||||||
otherMessages = append(otherMessages, tmsg.Command())
|
otherMessages = append(otherMessages, tmsg.Command())
|
||||||
if len(otherMessages) > tolerateMessages {
|
if len(otherMessages) > tolerateMessages {
|
||||||
log.Printf("[%s] Giving up with %d results after tolerating messages: %v.", address, len(r), otherMessages)
|
logger.Debugf("[%s] Giving up with %d results after tolerating messages: %v.", address, len(r), otherMessages)
|
||||||
return &r
|
return &r
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -137,7 +136,7 @@ func (c *Crawler) Start() {
|
||||||
numWorkers += 1
|
numWorkers += 1
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
log.Printf("[%s] Worker started.", address)
|
logger.Debugf("[%s] Worker started.", address)
|
||||||
results := *c.handleAddress(address)
|
results := *c.handleAddress(address)
|
||||||
c.results <- results
|
c.results <- results
|
||||||
}()
|
}()
|
||||||
|
@ -156,11 +155,11 @@ func (c *Crawler) Start() {
|
||||||
numWorkers -= 1
|
numWorkers -= 1
|
||||||
|
|
||||||
if len(r) > 0 {
|
if len(r) > 0 {
|
||||||
log.Printf("Added %d new peers of %d returned. Total %d known peers via %d connected.", newAdded, len(r), c.count, numGood)
|
logger.Infof("Added %d new peers of %d returned. Total %d known peers via %d connected.", newAdded, len(r), c.count, numGood)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(c.queue) == 0 && numWorkers == 0 {
|
if len(c.queue) == 0 && numWorkers == 0 {
|
||||||
log.Printf("Done.")
|
logger.Infof("Done.")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/alexcesaro/log/golog"
|
||||||
|
)
|
||||||
|
|
||||||
|
var logger *golog.Logger
|
||||||
|
|
||||||
|
// TODO: Init a default logger in case it's used as a lib?
|
7
peer.go
7
peer.go
|
@ -3,7 +3,6 @@ package main
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/conformal/btcwire"
|
"github.com/conformal/btcwire"
|
||||||
"log"
|
|
||||||
"net"
|
"net"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -37,7 +36,7 @@ func (p *Peer) Connect() error {
|
||||||
|
|
||||||
func (p *Peer) Disconnect() {
|
func (p *Peer) Disconnect() {
|
||||||
p.conn.Close()
|
p.conn.Close()
|
||||||
log.Printf("[%s] Closed.", p.address)
|
logger.Debugf("[%s] Closed.", p.address)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Peer) Handshake() error {
|
func (p *Peer) Handshake() error {
|
||||||
|
@ -45,7 +44,7 @@ func (p *Peer) Handshake() error {
|
||||||
return fmt.Errorf("Peer is not connected, can't handshake.")
|
return fmt.Errorf("Peer is not connected, can't handshake.")
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("[%s] Starting handshake.", p.address)
|
logger.Debugf("[%s] Starting handshake.", p.address)
|
||||||
|
|
||||||
nonce, err := btcwire.RandomUint64()
|
nonce, err := btcwire.RandomUint64()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -74,7 +73,7 @@ func (p *Peer) Handshake() error {
|
||||||
if uint32(vmsg.ProtocolVersion) < pver {
|
if uint32(vmsg.ProtocolVersion) < pver {
|
||||||
pver = uint32(vmsg.ProtocolVersion)
|
pver = uint32(vmsg.ProtocolVersion)
|
||||||
}
|
}
|
||||||
log.Printf("[%s] -> Version: %s", p.address, vmsg.UserAgent)
|
logger.Debugf("[%s] -> Version: %s", p.address, vmsg.UserAgent)
|
||||||
|
|
||||||
// Normally we'd check if vmsg.Nonce == p.nonce but the crawler does not
|
// Normally we'd check if vmsg.Nonce == p.nonce but the crawler does not
|
||||||
// accept external connections so we skip it.
|
// accept external connections so we skip it.
|
||||||
|
|
7
seed.go
7
seed.go
|
@ -2,7 +2,6 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/conformal/btcwire"
|
"github.com/conformal/btcwire"
|
||||||
"log"
|
|
||||||
"net"
|
"net"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
@ -17,10 +16,10 @@ func GetSeedsFromDNS(dnsSeeds []string) []string {
|
||||||
defer wait.Done()
|
defer wait.Done()
|
||||||
ips, err := net.LookupIP(address)
|
ips, err := net.LookupIP(address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Failed to resolve %s: %v", address, err)
|
logger.Warningf("Failed to resolve %s: %v", address, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Printf("Resolved %d seeds from %s.", len(ips), address)
|
logger.Debugf("Resolved %d seeds from %s.", len(ips), address)
|
||||||
results <- ips
|
results <- ips
|
||||||
}(address)
|
}(address)
|
||||||
}
|
}
|
||||||
|
@ -37,7 +36,7 @@ func GetSeedsFromDNS(dnsSeeds []string) []string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("Resolved %d seed nodes from %d DNS seeds.", len(seeds), len(dnsSeeds))
|
logger.Infof("Resolved %d seed nodes from %d DNS seeds.", len(seeds), len(dnsSeeds))
|
||||||
|
|
||||||
// Note that this will likely include duplicate seeds. The crawler deduplicates them.
|
// Note that this will likely include duplicate seeds. The crawler deduplicates them.
|
||||||
return seeds
|
return seeds
|
||||||
|
|
Loading…
Reference in New Issue