@@ -24,7 +24,9 @@ def __init__(self, config):
24
24
self .nodes = set ()
25
25
26
26
def get_dns_nodes (self ):
27
- for host in hosts :
27
+ for host in self .config ["dns_seed" ]:
28
+ if not host :
29
+ continue
28
30
ips = socket .gethostbyname_ex (host )[2 ]
29
31
for ip in ips :
30
32
yield ip
@@ -38,34 +40,60 @@ def get_external_ip_using_http(self):
38
40
39
41
def seed_dns_nodes (self ):
40
42
for ip in self .get_dns_nodes ():
43
+ if not ip :
44
+ continue
41
45
self .add_node_address ((ip , config ["default_port" ]))
42
46
43
47
def event_loop (self ):
44
- seeder = None
45
- state = 1
46
- if self .config .get ("irc" , None ) is not None :
47
- seeder = irc .BIRCSeeder (self )
48
- state = 0
49
-
48
+ bootstrap = True
49
+ birc = None
50
+ uptime_wait = 1
51
+ if self .config .get ("irc" , None ):
52
+ birc = irc .BIRCSeeder (self )
53
+ uptime_wait = 10
54
+
55
+ nodes = []
56
+ if self .config ["nodes" ]:
57
+ for node in self .config ["nodes" ]:
58
+ self .add_node_address (node )
59
+
60
+ uptime = self .get_uptime ()
61
+ delta = 0
50
62
while True :
51
63
asyncore .loop (timeout = self .config ["event_loop_timeout" ],count = 1 )
52
64
time .sleep (self .config ["event_loop_sleep" ])
53
- if state == 0 :
54
- if seeder :
55
- if self .config .get ("external_ip" , None ) and len (self .addresses [1 ]) > 0 :
56
- state = 2
57
- elif self .get_uptime () > self .config ["irc_timeout" ]:
58
- logging .error ("IRC failed to get external IP or nodes within %s seconds" , self .get_uptime ())
59
- state = 1
60
- elif state == 1 :
61
- self .set_external_ip (self .get_external_ip_using_http ())
62
- self .seed_dns_nodes ()
63
- state = 2
64
- elif state == 2 :
65
+ delta += self .get_uptime () - uptime
66
+ uptime = self .get_uptime ()
67
+ if bootstrap and uptime > uptime_wait and delta > 1 :
68
+ delta = 0
69
+ eip = self .config .get ("external_ip" , None )
70
+ naddr = len (self .addresses [1 ])
71
+ if eip and naddr > 0 :
72
+ bootstrap = False
73
+ continue
74
+ if birc and uptime > self .config ["irc_timeout" ]:
75
+ logging .error ("IRC failed to get external IP or nodes within %s seconds, falling back" , uptime )
76
+ birc .close ()
77
+ birc = None
78
+ if not birc :
79
+ if self .config .get ("dns_seed" ):
80
+ logging .debug ("seeding using dns" )
81
+ self .seed_dns_nodes ()
82
+ if not eip :
83
+ ip = self .get_external_ip_using_http ()
84
+ self .set_external_ip (ip )
85
+ bootstrap = False
86
+ elif not bootstrap and delta > 1 :
65
87
if len (self .nodes ) < self .config ["maxconnections" ]:
66
- self .create_node_connection ()
88
+ if len (self .addresses [0 ]) > 0 :
89
+ self .create_node_connection ()
90
+ elif len (self .addresses [1 ]) == 0 :
91
+ logging .error ("No addresses available" )
92
+ time .sleep (5 )
67
93
68
94
def create_node_connection (self ):
95
+ if len (self .addresses [0 ]) == 0 :
96
+ return
69
97
addr = self .addresses [0 ].pop ()
70
98
node = net .BConnection (addr , self )
71
99
self .nodes .add (node )
@@ -76,8 +104,12 @@ def add_node_address(self, addr):
76
104
self .addresses [1 ].add (addr )
77
105
78
106
def set_external_ip (self , ip ):
107
+ logging .debug ("got external ip %s" , ip )
79
108
self .config ["external_ip" ] = ip
80
109
110
+ def get_external_address (self ):
111
+ return self .config ["external_ip" ]
112
+
81
113
def get_last_block (self ):
82
114
return len (self .blocks )
83
115
0 commit comments