From 75767b0eebcb7438c4af06dd3c653251542a8073 Mon Sep 17 00:00:00 2001 From: Lyndsay Roger Date: Tue, 22 Sep 2015 12:48:07 +1200 Subject: [PATCH] Add support to start crawling from one initial ip address --- network.go | 78 +++++++++++++++++------------------------------------- seeder.go | 52 +++++++++++++++++++----------------- 2 files changed, 51 insertions(+), 79 deletions(-) diff --git a/network.go b/network.go index a7d6326..738a51e 100644 --- a/network.go +++ b/network.go @@ -12,19 +12,17 @@ import ( // JNetwork is the exported struct that is read from the network file type JNetwork struct { - Name string - Desc string - SeederType string - Secret string - Remote string - Id string - Port uint16 - Pver uint32 - DNSName string - TTL uint32 - Seeder1 string - Seeder2 string - Seeder3 string + Name string + Desc string + Id string + Port uint16 + Pver uint32 + DNSName string + TTL uint32 + InitialIP string + Seeder1 string + Seeder2 string + Seeder3 string } func createNetFile() { @@ -32,19 +30,17 @@ func createNetFile() { // create a struct to encode with json jnw := &JNetwork{ - Id: "0xabcdef01", - Port: 1234, - Pver: 70001, - TTL: 600, - DNSName: "seeder.example.com", - Name: "SeederNet", - Desc: "Description of SeederNet", - SeederType: "Combined", - Secret: "32bYTesoFSECretThAtiSASecrET!!", - Remote: "http://dnsserver.example.com:1234/updatedns", - Seeder1: "seeder1.example.com", - Seeder2: "seed1.bob.com", - Seeder3: "seed2.example.com", + Id: "0xabcdef01", + Port: 1234, + Pver: 70001, + TTL: 600, + DNSName: "seeder.example.com", + Name: "SeederNet", + Desc: "Description of SeederNet", + InitialIP: "", + Seeder1: "seeder1.example.com", + Seeder2: "seed1.bob.com", + Seeder3: "seed2.example.com", } f, err := os.Create("dnsseeder.json") @@ -91,12 +87,6 @@ func initNetwork(jnw JNetwork) (*dnsseeder, error) { return nil, errors.New(fmt.Sprintf("No DNS Hostname supplied")) } - // we only need a secret if we are a crawler or dns type - if needSecret := convertSeederType(jnw.SeederType); needSecret != typeCombined { - if ok := checkBlockSize(jnw.Secret); ok != true { - return nil, errors.New(fmt.Sprintf("shared secret must be either 16, 24 or 32 bytes long. currently: %v", len(jnw.Secret))) - } - } if _, ok := config.seeders[jnw.Name]; ok { return nil, errors.New(fmt.Sprintf("Name already exists from previous file - %s", jnw.Name)) } @@ -110,9 +100,6 @@ func initNetwork(jnw JNetwork) (*dnsseeder, error) { seeder.name = jnw.Name seeder.desc = jnw.Desc seeder.dnsHost = jnw.DNSName - seeder.seederType = convertSeederType(jnw.SeederType) - seeder.secret = jnw.Secret - seeder.remote = jnw.Remote // conver the network magic number to a Uint32 t1, err := strconv.ParseUint(jnw.Id, 0, 32) @@ -121,6 +108,8 @@ func initNetwork(jnw JNetwork) (*dnsseeder, error) { } seeder.id = wire.BitcoinNet(t1) + seeder.initialIP = jnw.InitialIP + // load the seeder dns seeder.seeders = make([]string, 3) seeder.seeders[0] = jnw.Seeder1 @@ -154,25 +143,6 @@ func initNetwork(jnw JNetwork) (*dnsseeder, error) { return seeder, nil } -func convertSeederType(seederType string) uint32 { - switch seederType { - case "Crawl": - return typeCrawl - case "DNS": - return typeDNS - default: - return typeCombined - } -} - -func checkBlockSize(secret string) bool { - s := len(secret) - if s == 16 || s == 24 || s == 32 { - return true - } - return false -} - /* */ diff --git a/seeder.go b/seeder.go index 5e723e0..8fd167f 100644 --- a/seeder.go +++ b/seeder.go @@ -45,31 +45,22 @@ const ( maxStatusTypes // used in main to allocate slice ) -const ( - // seederType - typeCombined = iota // This seeder both crawls and provides dns responses - typeCrawl // this seeder just crawls the network and sends ip info to a remote dns server - typeDNS // this seeder just provides dns data to clients and does no crawling itself -) - type dnsseeder struct { - id wire.BitcoinNet // Magic number - Unique ID for this network. Sent in header of all messages - theList map[string]*node // the list of current nodes - mtx sync.RWMutex // protect thelist - maxSize int // max number of clients before we start restricting new entries - port uint16 // default network port this seeder uses - pver uint32 // minimum block height for the seeder - ttl uint32 // DNS TTL to use for this seeder - dnsHost string // dns host we will serve results for this domain - name string // Short name for the network - desc string // Long description for the network - seederType uint32 // Combined, crawl or DNS only - secret string // Shared secret with remote seeder to encrypt messages - remote string // Remote host and port to send dns info if we are a crawler - seeders []string // slice of seeders to pull ip addresses when starting this seeder - maxStart []uint32 // max number of goroutines to start each run for each status type - delay []int64 // number of seconds to wait before we connect to a known client for each status - counts NodeCounts // structure to hold stats for this seeder + id wire.BitcoinNet // Magic number - Unique ID for this network. Sent in header of all messages + theList map[string]*node // the list of current nodes + mtx sync.RWMutex // protect thelist + maxSize int // max number of clients before we start restricting new entries + port uint16 // default network port this seeder uses + pver uint32 // minimum block height for the seeder + ttl uint32 // DNS TTL to use for this seeder + dnsHost string // dns host we will serve results for this domain + name string // Short name for the network + desc string // Long description for the network + initialIP string // Initial ip address to connect to and ask for addresses if we have no seeders + seeders []string // slice of seeders to pull ip addresses when starting this seeder + maxStart []uint32 // max number of goroutines to start each run for each status type + delay []int64 // number of seconds to wait before we connect to a known client for each status + counts NodeCounts // structure to hold stats for this seeder } // initCrawlers needs to be run before the startCrawlers so it can get @@ -101,12 +92,23 @@ func (s *dnsseeder) initCrawlers() { log.Printf("%s: completed import of %v addresses from %s\n", s.name, c, aseeder) } } + + // load one ip address into system and start crawling from it + if len(s.theList) == 0 && s.initialIP != "" { + if newIP := net.ParseIP(s.initialIP); newIP != nil { + // 1 at the end is the services flag + if x := s.addNa(wire.NewNetAddressIPPort(newIP, s.port, 1)); x == true { + log.Printf("%s: crawling with initial IP %s \n", s.name, s.initialIP) + } + } + } + if len(s.theList) == 0 { log.Printf("%s: Error: No ip addresses from seeders so I have nothing to crawl.\n", s.name) for _, v := range s.seeders { log.Printf("%s: Seeder: %s\n", s.name, v) - } + log.Printf("%s: Initial IP: %s\n", s.name, s.initialIP) } }