Browse Source

Add extra fields to json config to support remote crawlers

master
Lyndsay Roger 9 years ago
parent
commit
ec1cbdfe60
  1. 76
      network.go
  2. 46
      seeder.go

76
network.go

@ -12,16 +12,19 @@ import (
// JNetwork is the exported struct that is read from the network file // JNetwork is the exported struct that is read from the network file
type JNetwork struct { type JNetwork struct {
Name string Name string
Desc string Desc string
Id string SeederType string
Port uint16 Secret string
Pver uint32 Remote string
DNSName string Id string
TTL uint32 Port uint16
Seeder1 string Pver uint32
Seeder2 string DNSName string
Seeder3 string TTL uint32
Seeder1 string
Seeder2 string
Seeder3 string
} }
func createNetFile() { func createNetFile() {
@ -29,16 +32,19 @@ func createNetFile() {
// create a struct to encode with json // create a struct to encode with json
jnw := &JNetwork{ jnw := &JNetwork{
Id: "0xabcdef01", Id: "0xabcdef01",
Port: 1234, Port: 1234,
Pver: 70001, Pver: 70001,
TTL: 600, TTL: 600,
DNSName: "seeder.example.com", DNSName: "seeder.example.com",
Name: "SeederNet", Name: "SeederNet",
Desc: "Description of SeederNet", Desc: "Description of SeederNet",
Seeder1: "seeder1.example.com", SeederType: "Combined",
Seeder2: "seed1.bob.com", Secret: "32bYTesoFSECretThAtiSASecrET!!",
Seeder3: "seed2.example.com", Remote: "ipofdnsserver.example.com:1234",
Seeder1: "seeder1.example.com",
Seeder2: "seed1.bob.com",
Seeder3: "seed2.example.com",
} }
f, err := os.Create("dnsseeder.json") f, err := os.Create("dnsseeder.json")
@ -72,10 +78,10 @@ func loadNetwork(fName string) (*dnsseeder, error) {
return nil, errors.New(fmt.Sprintf("Error decoding network file: %v", err)) return nil, errors.New(fmt.Sprintf("Error decoding network file: %v", err))
} }
return initNetwork(jnw, jnw.Name) return initNetwork(jnw)
} }
func initNetwork(jnw JNetwork, name string) (*dnsseeder, error) { func initNetwork(jnw JNetwork) (*dnsseeder, error) {
if jnw.Port == 0 { if jnw.Port == 0 {
return nil, errors.New(fmt.Sprintf("Invalid port supplied: %v", jnw.Port)) return nil, errors.New(fmt.Sprintf("Invalid port supplied: %v", jnw.Port))
@ -85,6 +91,10 @@ func initNetwork(jnw JNetwork, name string) (*dnsseeder, error) {
return nil, errors.New(fmt.Sprintf("No DNS Hostname supplied")) return nil, errors.New(fmt.Sprintf("No DNS Hostname supplied"))
} }
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 { if _, ok := config.seeders[jnw.Name]; ok {
return nil, errors.New(fmt.Sprintf("Name already exists from previous file - %s", jnw.Name)) return nil, errors.New(fmt.Sprintf("Name already exists from previous file - %s", jnw.Name))
} }
@ -98,6 +108,9 @@ func initNetwork(jnw JNetwork, name string) (*dnsseeder, error) {
seeder.name = jnw.Name seeder.name = jnw.Name
seeder.desc = jnw.Desc seeder.desc = jnw.Desc
seeder.dnsHost = jnw.DNSName 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 // conver the network magic number to a Uint32
t1, err := strconv.ParseUint(jnw.Id, 0, 32) t1, err := strconv.ParseUint(jnw.Id, 0, 32)
@ -139,6 +152,25 @@ func initNetwork(jnw JNetwork, name string) (*dnsseeder, error) {
return seeder, nil 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
}
/* /*
*/ */

46
seeder.go

@ -45,29 +45,31 @@ const (
maxStatusTypes // used in main to allocate slice maxStatusTypes // used in main to allocate slice
) )
/* NdCounts holds various statistics about the running system const (
type NdCounts struct { // seederType
NdStatus []uint32 typeCombined = iota // This seeder both crawls and provides dns responses
NdStarts []uint32 typeCrawl // this seeder just crawls the network and sends ip info to a remote dns server
DNSCounts []uint32 typeDNS // this seeder just provides dns data to clients and does no crawling itself
mtx sync.RWMutex )
}
*/
type dnsseeder struct { type dnsseeder struct {
id wire.BitcoinNet // Magic number - Unique ID for this network. Sent in header of all messages 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 theList map[string]*node // the list of current nodes
mtx sync.RWMutex // protect thelist mtx sync.RWMutex // protect thelist
maxSize int // max number of clients before we start restricting new entries maxSize int // max number of clients before we start restricting new entries
port uint16 // default network port this seeder uses port uint16 // default network port this seeder uses
pver uint32 // minimum block height for the seeder pver uint32 // minimum block height for the seeder
ttl uint32 // DNS TTL to use for this seeder ttl uint32 // DNS TTL to use for this seeder
dnsHost string // dns host we will serve results for this domain dnsHost string // dns host we will serve results for this domain
name string // Short name for the network name string // Short name for the network
desc string // Long description for the network desc string // Long description for the network
seeders []string // slice of seeders to pull ip addresses when starting this seeder seederType uint32 // Combined, crawl or DNS only
maxStart []uint32 // max number of goroutines to start each run for each status type secret string // Shared secret with remote seeder to encrypt messages
delay []int64 // number of seconds to wait before we connect to a known client for each status remote string // Remote host and port to send dns info if we are a crawler
counts NodeCounts // structure to hold stats for this seeder 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 // initCrawlers needs to be run before the startCrawlers so it can get

Loading…
Cancel
Save