@@ -36,159 +36,160 @@ def run(*args):
3636 # Create the database
3737 db = Database (testnet = TESTNET )
3838
39- # logging
40- logFile = logfile .LogFile .fromFullPath (DATA_FOLDER + "debug.log" , rotateLength = 15000000 , maxRotatedFiles = 1 )
41- log .addObserver (FileLogObserver (logFile , level = "debug" ).emit )
42- log .addObserver (FileLogObserver (level = "debug" ).emit )
43- logger = Logger (system = "Httpseed" )
39+ def start_server (keychain , first_startup = False ):
40+ # logging
41+ logFile = logfile .LogFile .fromFullPath (DATA_FOLDER + "debug.log" , rotateLength = 15000000 , maxRotatedFiles = 1 )
42+ log .addObserver (FileLogObserver (logFile , level = "debug" ).emit )
43+ log .addObserver (FileLogObserver (level = "debug" ).emit )
44+ logger = Logger (system = "Httpseed" )
4445
45- # Load the keys
46- keychain = KeyChain (db )
46+ if os .path .isfile (DATA_FOLDER + 'keys.pickle' ):
47+ keys = pickle .load (open (DATA_FOLDER + "keys.pickle" , "r" ))
48+ signing_key_hex = keys ["signing_privkey" ]
49+ signing_key = nacl .signing .SigningKey (signing_key_hex , encoder = nacl .encoding .HexEncoder )
50+ else :
51+ signing_key = nacl .signing .SigningKey .generate ()
52+ keys = {
53+ 'signing_privkey' : signing_key .encode (encoder = nacl .encoding .HexEncoder ),
54+ 'signing_pubkey' : signing_key .verify_key .encode (encoder = nacl .encoding .HexEncoder )
55+ }
56+ pickle .dump (keys , open (DATA_FOLDER + "keys.pickle" , "wb" ))
4757
48- if os .path .isfile (DATA_FOLDER + 'keys.pickle' ):
49- keys = pickle .load (open (DATA_FOLDER + "keys.pickle" , "r" ))
50- signing_key_hex = keys ["signing_privkey" ]
51- signing_key = nacl .signing .SigningKey (signing_key_hex , encoder = nacl .encoding .HexEncoder )
52- else :
53- signing_key = nacl .signing .SigningKey .generate ()
54- keys = {
55- 'signing_privkey' : signing_key .encode (encoder = nacl .encoding .HexEncoder ),
56- 'signing_pubkey' : signing_key .verify_key .encode (encoder = nacl .encoding .HexEncoder )
57- }
58- pickle .dump (keys , open (DATA_FOLDER + "keys.pickle" , "wb" ))
58+ # Stun
59+ port = 18467 if not TESTNET else 28467
60+ logger .info ("Finding NAT Type..." )
61+ response = stun .get_ip_info (stun_host = "stun.l.google.com" , source_port = port , stun_port = 19302 )
62+ logger .info ("%s on %s:%s" % (response [0 ], response [1 ], response [2 ]))
63+ ip_address = response [1 ]
64+ port = response [2 ]
5965
60- # Stun
61- port = 18467 if not TESTNET else 28467
62- logger .info ("Finding NAT Type..." )
63- response = stun .get_ip_info (stun_host = "stun.l.google.com" , source_port = port , stun_port = 19302 )
64- logger .info ("%s on %s:%s" % (response [0 ], response [1 ], response [2 ]))
65- ip_address = response [1 ]
66- port = response [2 ]
66+ # Start the kademlia server
67+ this_node = Node (keychain .guid , ip_address , port ,
68+ keychain .verify_key .encode (), None , objects .FULL_CONE , False )
69+ protocol = OpenBazaarProtocol (db , (ip_address , port ), objects .FULL_CONE , testnet = TESTNET , relaying = True )
6770
68- # Start the kademlia server
69- this_node = Node (keychain .guid , ip_address , port ,
70- keychain .verify_key .encode (), None , objects .FULL_CONE , False )
71- protocol = OpenBazaarProtocol (db , (ip_address , port ), objects .FULL_CONE , testnet = TESTNET , relaying = True )
71+ try :
72+ kserver = Server .loadState ('cache.pickle' , ip_address , port , protocol , db , objects .FULL_CONE , None )
73+ except Exception :
74+ kserver = Server (this_node , db , keychain .signing_key )
75+ kserver .protocol .connect_multiplexer (protocol )
7276
73- try :
74- kserver = Server .loadState ('cache.pickle' , ip_address , port , protocol , db , objects .FULL_CONE , None )
75- except Exception :
76- kserver = Server (this_node , db , keychain .signing_key )
77- kserver .protocol .connect_multiplexer (protocol )
77+ protocol .register_processor (kserver .protocol )
78+ kserver .saveStateRegularly ('cache.pickle' , 10 )
7879
79- protocol .register_processor (kserver .protocol )
80- kserver .saveStateRegularly ('cache.pickle' , 10 )
80+ reactor .listenUDP (port , protocol )
8181
82- reactor .listenUDP (port , protocol )
83-
84- class WebResource (resource .Resource ):
85- def __init__ (self , kserver_r ):
86- resource .Resource .__init__ (self )
87- self .kserver = kserver_r
88- self .nodes = {}
89- for bucket in self .kserver .protocol .router .buckets :
90- for node in bucket .getNodes ():
91- self .nodes [(node .ip , node .port )] = node
92- self .nodes [(this_node .ip , this_node .port )] = this_node
93- loopingCall = task .LoopingCall (self .crawl )
94- loopingCall .start (180 , True )
95-
96- def crawl (self ):
97- def gather_results (result ):
98- for proto in result :
99- n = objects .Node ()
100- try :
101- n .ParseFromString (proto )
102- node = Node (n .guid , n .nodeAddress .ip , n .nodeAddress .port , n .signedPublicKey ,
103- None if not n .HasField ("relayAddress" ) else
104- (n .relayAddress .ip , n .relayAddress .port ),
105- n .natType ,
106- n .vendor )
82+ class WebResource (resource .Resource ):
83+ def __init__ (self , kserver_r ):
84+ resource .Resource .__init__ (self )
85+ self .kserver = kserver_r
86+ self .nodes = {}
87+ for bucket in self .kserver .protocol .router .buckets :
88+ for node in bucket .getNodes ():
10789 self .nodes [(node .ip , node .port )] = node
108- except Exception :
109- pass
90+ self .nodes [(this_node .ip , this_node .port )] = this_node
91+ loopingCall = task .LoopingCall (self .crawl )
92+ loopingCall .start (180 , True )
11093
111- def start_crawl (results ):
112- for node , result in results .items ():
113- if not result [0 ]:
114- del self .nodes [(node .ip , node .port )]
115- node = Node (digest (random .getrandbits (255 )))
116- nearest = self .kserver .protocol .router .findNeighbors (node )
117- spider = NodeSpiderCrawl (self .kserver .protocol , node , nearest , 100 , 4 )
118- spider .find ().addCallback (gather_results )
94+ def crawl (self ):
95+ def gather_results (result ):
96+ for proto in result :
97+ n = objects .Node ()
98+ try :
99+ n .ParseFromString (proto )
100+ node = Node (n .guid , n .nodeAddress .ip , n .nodeAddress .port , n .signedPublicKey ,
101+ None if not n .HasField ("relayAddress" ) else
102+ (n .relayAddress .ip , n .relayAddress .port ),
103+ n .natType ,
104+ n .vendor )
105+ self .nodes [(node .ip , node .port )] = node
106+ except Exception :
107+ pass
119108
120- ds = {}
121- for bucket in self . kserver . protocol . router . buckets :
122- for node in bucket . getNodes () :
123- self .nodes [(node .ip , node .port )] = node
124- for node in self . nodes . values ():
125- if node . id != this_node . id :
126- ds [ node ] = self .kserver .protocol . callPing ( node )
127- deferredDict ( ds ).addCallback (start_crawl )
109+ def start_crawl ( results ):
110+ for node , result in results . items () :
111+ if not result [ 0 ] :
112+ del self .nodes [(node .ip , node .port )]
113+ node = Node ( digest ( random . getrandbits ( 255 )))
114+ nearest = self . kserver . protocol . router . findNeighbors ( node )
115+ spider = NodeSpiderCrawl ( self .kserver .protocol , node , nearest , 100 , 4 )
116+ spider . find ( ).addCallback (gather_results )
128117
129- def getChild (self , child , request ):
130- return self
118+ ds = {}
119+ for bucket in self .kserver .protocol .router .buckets :
120+ for node in bucket .getNodes ():
121+ self .nodes [(node .ip , node .port )] = node
122+ for node in self .nodes .values ():
123+ if node .id != this_node .id :
124+ ds [node ] = self .kserver .protocol .callPing (node )
125+ deferredDict (ds ).addCallback (start_crawl )
131126
132- def render_GET (self , request ):
133- nodes = self .nodes .values ()
134- shuffle (nodes )
135- logger .info ("Received a request for nodes, responding..." )
136- if "format" in request .args :
137- if request .args ["format" ][0 ] == "json" :
138- json_list = []
139- if "type" in request .args and request .args ["type" ][0 ] == "vendors" :
140- for node in nodes :
141- if node .vendor is True :
127+ def getChild (self , child , request ):
128+ return self
129+
130+ def render_GET (self , request ):
131+ nodes = self .nodes .values ()
132+ shuffle (nodes )
133+ logger .info ("Received a request for nodes, responding..." )
134+ if "format" in request .args :
135+ if request .args ["format" ][0 ] == "json" :
136+ json_list = []
137+ if "type" in request .args and request .args ["type" ][0 ] == "vendors" :
138+ for node in nodes :
139+ if node .vendor is True :
140+ node_dic = {}
141+ node_dic ["ip" ] = node .ip
142+ node_dic ["port" ] = node .port
143+ node_dic ["guid" ] = node .id .encode ("hex" )
144+ json_list .append (node_dic )
145+ sig = signing_key .sign (str (json_list ))
146+ resp = {"peers" : json_list , "signature" : hexlify (sig [:64 ])}
147+ request .write (json .dumps (resp , indent = 4 ))
148+ else :
149+ for node in nodes [:50 ]:
142150 node_dic = {}
143151 node_dic ["ip" ] = node .ip
144152 node_dic ["port" ] = node .port
145- node_dic ["guid" ] = node .id .encode ("hex" )
146153 json_list .append (node_dic )
147- sig = signing_key .sign (str (json_list ))
148- resp = {"peers" : json_list , "signature" : hexlify (sig [:64 ])}
149- request .write (json .dumps (resp , indent = 4 ))
150- else :
154+ sig = signing_key .sign (str (json_list ))
155+ resp = {"peers" : json_list , "signature" : hexlify (sig [:64 ])}
156+ request .write (json .dumps (resp , indent = 4 ))
157+ elif request .args ["format" ][0 ] == "protobuf" :
158+ proto = peers .PeerSeeds ()
151159 for node in nodes [:50 ]:
152- node_dic = {}
153- node_dic ["ip" ] = node .ip
154- node_dic ["port" ] = node .port
155- json_list .append (node_dic )
156- sig = signing_key .sign (str (json_list ))
157- resp = {"peers" : json_list , "signature" : hexlify (sig [:64 ])}
158- request .write (json .dumps (resp , indent = 4 ))
159- elif request .args ["format" ][0 ] == "protobuf" :
160+ proto .serializedNode .append (node .getProto ().SerializeToString ())
161+
162+ sig = signing_key .sign ("" .join (proto .serializedNode ))[:64 ]
163+ proto .signature = sig
164+ uncompressed_data = proto .SerializeToString ()
165+ request .write (uncompressed_data .encode ("zlib" ))
166+ else :
160167 proto = peers .PeerSeeds ()
161- for node in nodes [:50 ]:
162- proto .serializedNode .append (node .getProto ().SerializeToString ())
168+ if "type" in request .args and request .args ["type" ][0 ] == "vendors" :
169+ for node in nodes :
170+ if node .vendor is True :
171+ proto .serializedNode .append (node .getProto ().SerializeToString ())
163172
164- sig = signing_key .sign ("" .join (proto .serializedNode ))[:64 ]
165- proto .signature = sig
166- uncompressed_data = proto .SerializeToString ()
167- request .write (uncompressed_data .encode ("zlib" ))
168- else :
169- proto = peers .PeerSeeds ()
170- if "type" in request .args and request .args ["type" ][0 ] == "vendors" :
171- for node in nodes :
172- if node .vendor is True :
173+ sig = signing_key .sign ("" .join (proto .serializedNode ))[:64 ]
174+ proto .signature = sig
175+ uncompressed_data = proto .SerializeToString ()
176+ request .write (uncompressed_data .encode ("zlib" ))
177+ else :
178+ for node in nodes [:50 ]:
173179 proto .serializedNode .append (node .getProto ().SerializeToString ())
174180
175- sig = signing_key .sign ("" .join (proto .serializedNode ))[:64 ]
176- proto .signature = sig
177- uncompressed_data = proto .SerializeToString ()
178- request .write (uncompressed_data .encode ("zlib" ))
179- else :
180- for node in nodes [:50 ]:
181- proto .serializedNode .append (node .getProto ().SerializeToString ())
181+ sig = signing_key .sign ("" .join (proto .serializedNode ))[:64 ]
182+ proto .signature = sig
183+ uncompressed_data = proto .SerializeToString ()
184+ request .write (uncompressed_data .encode ("zlib" ))
185+ request .finish ()
186+ return server .NOT_DONE_YET
182187
183- sig = signing_key .sign ("" .join (proto .serializedNode ))[:64 ]
184- proto .signature = sig
185- uncompressed_data = proto .SerializeToString ()
186- request .write (uncompressed_data .encode ("zlib" ))
187- request .finish ()
188- return server .NOT_DONE_YET
188+ server_protocol = server .Site (WebResource (kserver ))
189+ reactor .listenTCP (HTTPPORT , server_protocol )
189190
190- server_protocol = server . Site ( WebResource ( kserver ))
191- reactor . listenTCP ( HTTPPORT , server_protocol )
191+ # Generate keys and then start the server
192+ KeyChain ( db , start_server )
192193
193194 reactor .run ()
194195
0 commit comments