forked from LBRYCommunity/lbry-sdk
remove unused scripts
This commit is contained in:
parent
9582b7fcf5
commit
51b42da1c5
6 changed files with 0 additions and 686 deletions
|
@ -1,92 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# This library is free software, distributed under the terms of
|
||||
# the GNU Lesser General Public License Version 3, or any later version.
|
||||
# See the COPYING file included in this archive
|
||||
#
|
||||
|
||||
# Thanks to Paul Cannon for IP-address resolution functions (taken from aspn.activestate.com)
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import signal
|
||||
|
||||
amount = 0
|
||||
|
||||
|
||||
def destroyNetwork(nodes):
|
||||
print 'Destroying Kademlia network'
|
||||
i = 0
|
||||
for node in nodes:
|
||||
i += 1
|
||||
hashAmount = i * 50 / amount
|
||||
hashbar = '#' * hashAmount
|
||||
output = '\r[%-50s] %d/%d' % (hashbar, i, amount)
|
||||
sys.stdout.write(output)
|
||||
time.sleep(0.15)
|
||||
os.kill(node, signal.SIGTERM)
|
||||
print
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Launch a network of dht nodes")
|
||||
|
||||
parser.add_argument("amount_of_nodes",
|
||||
help="The number of nodes to create",
|
||||
type=int)
|
||||
parser.add_argument(
|
||||
"--nic_ip_address",
|
||||
help=("The network interface on which these nodes will listen for connections "
|
||||
"from each other and from other nodes. If omitted, an attempt will be "
|
||||
"made to automatically determine the system's IP address, but this may "
|
||||
"result in the nodes being reachable only from this system"))
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
global amount
|
||||
amount = args.amount_of_nodes
|
||||
if args.nic_ip_address:
|
||||
ipAddress = args.nic_ip_address
|
||||
else:
|
||||
import socket
|
||||
ipAddress = socket.gethostbyname(socket.gethostname())
|
||||
print 'Network interface IP address omitted; using %s' % ipAddress
|
||||
|
||||
startPort = 4000
|
||||
port = startPort + 1
|
||||
nodes = []
|
||||
print 'Creating Kademlia network'
|
||||
try:
|
||||
node = os.spawnlp(
|
||||
os.P_NOWAIT, 'lbrynet-launch-node', 'lbrynet-launch-node', str(startPort))
|
||||
nodes.append(node)
|
||||
for i in range(amount - 1):
|
||||
time.sleep(0.15)
|
||||
hashAmount = i * 50 / amount
|
||||
hashbar = '#' * hashAmount
|
||||
output = '\r[%-50s] %d/%d' % (hashbar, i, amount)
|
||||
sys.stdout.write(output)
|
||||
node = os.spawnlp(
|
||||
os.P_NOWAIT, 'lbrynet-launch-node', 'lbrynet-launch-node', str(port),
|
||||
ipAddress, str(startPort))
|
||||
nodes.append(node)
|
||||
port += 1
|
||||
except KeyboardInterrupt:
|
||||
'\nNetwork creation cancelled.'
|
||||
destroyNetwork(nodes)
|
||||
sys.exit(1)
|
||||
|
||||
print '\n\n---------------\nNetwork running\n---------------\n'
|
||||
try:
|
||||
while 1:
|
||||
time.sleep(1)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
finally:
|
||||
destroyNetwork(nodes)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,129 +0,0 @@
|
|||
from lbrynet.core import log_support
|
||||
|
||||
import logging.handlers
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
from lbrynet.dht.node import Node
|
||||
|
||||
from twisted.internet import reactor, defer
|
||||
from lbrynet.core.utils import generate_id
|
||||
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def print_usage():
|
||||
print "Usage:\n%s UDP_PORT KNOWN_NODE_IP KNOWN_NODE_PORT HASH"
|
||||
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def join_network(udp_port, known_nodes):
|
||||
lbryid = generate_id()
|
||||
|
||||
log.info('Creating node')
|
||||
node = Node(udpPort=udp_port, node_id=lbryid)
|
||||
|
||||
log.info('Joining network')
|
||||
yield node.joinNetwork(known_nodes)
|
||||
|
||||
defer.returnValue(node)
|
||||
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def get_hosts(node, h):
|
||||
log.info("Looking up %s", h)
|
||||
hosts = yield node.getPeersForBlob(h.decode("hex"))
|
||||
log.info("Hosts returned from the DHT: %s", hosts)
|
||||
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def announce_hash(node, h):
|
||||
results = yield node.announceHaveBlob(h, 34567)
|
||||
for success, result in results:
|
||||
if success:
|
||||
log.info("Succeeded: %s", str(result))
|
||||
else:
|
||||
log.info("Failed: %s", str(result.getErrorMessage()))
|
||||
|
||||
|
||||
# def get_args():
|
||||
# if len(sys.argv) < 5:
|
||||
# print_usage()
|
||||
# sys.exit(1)
|
||||
# udp_port = int(sys.argv[1])
|
||||
# known_nodes = [(sys.argv[2], int(sys.argv[3]))]
|
||||
# h = binascii.unhexlify(sys.argv[4])
|
||||
# return udp_port, known_nodes, h
|
||||
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def connect(port=None):
|
||||
try:
|
||||
if port is None:
|
||||
raise Exception("need a port")
|
||||
known_nodes = [('54.236.227.82', 4444)] # lbrynet1
|
||||
node = yield join_network(port, known_nodes)
|
||||
log.info("joined")
|
||||
reactor.callLater(3, find, node)
|
||||
except Exception:
|
||||
log.error("CAUGHT EXCEPTION")
|
||||
traceback.print_exc()
|
||||
log.info("Stopping reactor")
|
||||
yield reactor.stop()
|
||||
|
||||
|
||||
def getApproximateTotalDHTNodes(node):
|
||||
from lbrynet.dht import constants
|
||||
# get the deepest bucket and the number of contacts in that bucket and multiply it
|
||||
# by the number of equivalently deep buckets in the whole DHT to get a really bad
|
||||
# estimate!
|
||||
bucket = node._routingTable._buckets[node._routingTable._kbucketIndex(node.node_id)]
|
||||
num_in_bucket = len(bucket._contacts)
|
||||
factor = (2 ** constants.key_bits) / (bucket.rangeMax - bucket.rangeMin)
|
||||
return num_in_bucket * factor
|
||||
|
||||
|
||||
def getApproximateTotalHashes(node):
|
||||
# Divide the number of hashes we know about by k to get a really, really, really
|
||||
# bad estimate of the average number of hashes per node, then multiply by the
|
||||
# approximate number of nodes to get a horrendous estimate of the total number
|
||||
# of hashes in the DHT
|
||||
num_in_data_store = len(node._dataStore._dict)
|
||||
if num_in_data_store == 0:
|
||||
return 0
|
||||
return num_in_data_store * getApproximateTotalDHTNodes(node) / 8
|
||||
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def find(node):
|
||||
try:
|
||||
log.info("Approximate number of nodes in DHT: %s", str(getApproximateTotalDHTNodes(node)))
|
||||
log.info("Approximate number of blobs in DHT: %s", str(getApproximateTotalHashes(node)))
|
||||
|
||||
h = "578f5e82da7db97bfe0677826d452cc0c65406a8e986c9caa126af4ecdbf4913daad2f7f5d1fb0ffec17d0bf8f187f5a"
|
||||
peersFake = yield node.getPeersForBlob(h.decode("hex"))
|
||||
print peersFake
|
||||
peers = yield node.getPeersForBlob(h.decode("hex"))
|
||||
print peers
|
||||
|
||||
# yield get_hosts(node, h)
|
||||
except Exception:
|
||||
log.error("CAUGHT EXCEPTION")
|
||||
traceback.print_exc()
|
||||
|
||||
log.info("Stopping reactor")
|
||||
yield reactor.stop()
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
log_support.configure_console(level='DEBUG')
|
||||
log_support.configure_twisted()
|
||||
reactor.callLater(0, connect, port=10001)
|
||||
log.info("Running reactor")
|
||||
reactor.run()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
|
@ -1,163 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# This is a basic single-node example of how to use the Entangled
|
||||
# DHT. It creates a Node and (optionally) joins an existing DHT. It
|
||||
# then does a Kademlia store and find, and then it deletes the stored
|
||||
# value (non-Kademlia method).
|
||||
#
|
||||
# No tuple space functionality is demonstrated by this script.
|
||||
#
|
||||
# To test it properly, start a multi-node Kademlia DHT with the "create_network.py"
|
||||
# script and point this node to that, e.g.:
|
||||
# $python create_network.py 10 127.0.0.1
|
||||
#
|
||||
# $python basic_example.py 5000 127.0.0.1 4000
|
||||
#
|
||||
# This library is free software, distributed under the terms of
|
||||
# the GNU Lesser General Public License Version 3, or any later version.
|
||||
# See the COPYING file included in this archive
|
||||
#
|
||||
|
||||
# Thanks to Paul Cannon for IP-address resolution functions (taken from aspn.activestate.com)
|
||||
|
||||
|
||||
import binascii
|
||||
import random
|
||||
import twisted.internet.reactor
|
||||
from lbrynet.dht.node import Node
|
||||
from lbrynet.core.cryptoutils import get_lbry_hash_obj
|
||||
|
||||
# The Entangled DHT node; instantiated in the main() method
|
||||
node = None
|
||||
|
||||
# The key to use for this example when storing/retrieving data
|
||||
h = get_lbry_hash_obj()
|
||||
h.update("key")
|
||||
KEY = h.digest()
|
||||
# The value to store
|
||||
VALUE = random.randint(10000, 20000)
|
||||
|
||||
lbryid = KEY
|
||||
|
||||
|
||||
def storeValue(key, value):
|
||||
""" Stores the specified value in the DHT using the specified key """
|
||||
global node
|
||||
print '\nStoring value; Key: %s, Value: %s' % (key, value)
|
||||
# Store the value in the DHT. This method returns a Twisted
|
||||
# Deferred result, which we then add callbacks to
|
||||
deferredResult = node.announceHaveHash(key, value)
|
||||
# Add our callback; this method is called when the operation completes...
|
||||
deferredResult.addCallback(storeValueCallback)
|
||||
# ...and for error handling, add an "error callback" as well.
|
||||
#
|
||||
# For this example script, I use a generic error handler; usually
|
||||
# you would need something more specific
|
||||
deferredResult.addErrback(genericErrorCallback)
|
||||
|
||||
|
||||
def storeValueCallback(*args, **kwargs):
|
||||
""" Callback function that is invoked when the storeValue() operation succeeds """
|
||||
print 'Value has been stored in the DHT'
|
||||
# Now that the value has been stored, schedule that the value is read again after 2.5 seconds
|
||||
print 'Scheduling retrieval in 2.5 seconds'
|
||||
twisted.internet.reactor.callLater(2.5, getValue)
|
||||
|
||||
|
||||
def genericErrorCallback(failure):
|
||||
""" Callback function that is invoked if an error occurs during any of the DHT operations """
|
||||
print 'An error has occurred:', failure.getErrorMessage()
|
||||
twisted.internet.reactor.callLater(0, stop)
|
||||
|
||||
|
||||
def getValue():
|
||||
""" Retrieves the value of the specified key (KEY) from the DHT """
|
||||
global node, KEY
|
||||
# Get the value for the specified key (immediately returns a Twisted deferred result)
|
||||
print ('\nRetrieving value from DHT for key "%s"' %
|
||||
binascii.unhexlify("f7d9dc4de674eaa2c5a022eb95bc0d33ec2e75c6"))
|
||||
deferredResult = node.iterativeFindValue(
|
||||
binascii.unhexlify("f7d9dc4de674eaa2c5a022eb95bc0d33ec2e75c6"))
|
||||
# Add a callback to this result; this will be called as soon as the operation has completed
|
||||
deferredResult.addCallback(getValueCallback)
|
||||
# As before, add the generic error callback
|
||||
deferredResult.addErrback(genericErrorCallback)
|
||||
|
||||
|
||||
def getValueCallback(result):
|
||||
""" Callback function that is invoked when the getValue() operation succeeds """
|
||||
# Check if the key was found (result is a dict of format {key:
|
||||
# value}) or not (in which case a list of "closest" Kademlia
|
||||
# contacts would be returned instead")
|
||||
print "Got the value"
|
||||
print result
|
||||
|
||||
# Either way, schedule a "delete" operation for the key
|
||||
print 'Scheduling shutdown in 2.5 seconds'
|
||||
twisted.internet.reactor.callLater(2.5, stop)
|
||||
|
||||
|
||||
def stop():
|
||||
""" Stops the Twisted reactor, and thus the script """
|
||||
print '\nStopping Kademlia node and terminating script'
|
||||
twisted.internet.reactor.stop()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print 'Usage:\n%s UDP_PORT [KNOWN_NODE_IP KNOWN_NODE_PORT]' % sys.argv[0]
|
||||
print 'or:\n%s UDP_PORT [FILE_WITH_KNOWN_NODES]' % sys.argv[0]
|
||||
print
|
||||
print 'If a file is specified, it should containg one IP address and UDP port'
|
||||
print 'per line, seperated by a space.'
|
||||
sys.exit(1)
|
||||
try:
|
||||
int(sys.argv[1])
|
||||
except ValueError:
|
||||
print '\nUDP_PORT must be an integer value.\n'
|
||||
print 'Usage:\n%s UDP_PORT [KNOWN_NODE_IP KNOWN_NODE_PORT]' % sys.argv[0]
|
||||
print 'or:\n%s UDP_PORT [FILE_WITH_KNOWN_NODES]' % sys.argv[0]
|
||||
print
|
||||
print 'If a file is specified, it should contain one IP address and UDP port'
|
||||
print 'per line, seperated by a space.'
|
||||
sys.exit(1)
|
||||
|
||||
if len(sys.argv) == 4:
|
||||
knownNodes = [(sys.argv[2], int(sys.argv[3]))]
|
||||
elif len(sys.argv) == 3:
|
||||
knownNodes = []
|
||||
f = open(sys.argv[2], 'r')
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
for line in lines:
|
||||
ipAddress, udpPort = line.split()
|
||||
knownNodes.append((ipAddress, int(udpPort)))
|
||||
else:
|
||||
knownNodes = None
|
||||
print '\nNOTE: You have not specified any remote DHT node(s) to connect to'
|
||||
print 'It will thus not be aware of any existing DHT, but will still function as'
|
||||
print ' a self-contained DHT (until another node contacts it).'
|
||||
print 'Run this script without any arguments for info.\n'
|
||||
|
||||
# Set up SQLite-based data store (you could use an in-memory store instead, for example)
|
||||
#
|
||||
# Create the Entangled node. It extends the functionality of a
|
||||
# basic Kademlia node (but is fully backwards-compatible with a
|
||||
# Kademlia-only network)
|
||||
#
|
||||
# If you wish to have a pure Kademlia network, use the
|
||||
# entangled.kademlia.node.Node class instead
|
||||
print 'Creating Node'
|
||||
node = Node(udpPort=int(sys.argv[1]), node_id=lbryid)
|
||||
|
||||
# Schedule the node to join the Kademlia/Entangled DHT
|
||||
node.joinNetwork(knownNodes)
|
||||
# Schedule the "storeValue() call to be invoked after 2.5 seconds,
|
||||
# using KEY and VALUE as arguments
|
||||
twisted.internet.reactor.callLater(2.5, getValue)
|
||||
# Start the Twisted reactor - this fires up all networking, and
|
||||
# allows the scheduled join operation to take place
|
||||
print 'Twisted reactor started (script will commence in 2.5 seconds)'
|
||||
twisted.internet.reactor.run()
|
|
@ -1,41 +0,0 @@
|
|||
"""
|
||||
CLI for sending rpc commands to a DHT node
|
||||
"""
|
||||
|
||||
import argparse
|
||||
|
||||
from twisted.internet import reactor
|
||||
from txjsonrpc.web.jsonrpc import Proxy
|
||||
|
||||
|
||||
def print_value(value):
|
||||
print value
|
||||
|
||||
|
||||
def print_error(err):
|
||||
print err.getErrorMessage()
|
||||
|
||||
|
||||
def shut_down():
|
||||
reactor.stop()
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Send an rpc command to a dht node")
|
||||
parser.add_argument("rpc_command",
|
||||
help="The rpc command to send to the dht node")
|
||||
parser.add_argument("--node_host",
|
||||
help="The host of the node to connect to",
|
||||
default="127.0.0.1")
|
||||
parser.add_argument("--node_port",
|
||||
help="The port of the node to connect to",
|
||||
default="8888")
|
||||
|
||||
args = parser.parse_args()
|
||||
connect_string = 'http://%s:%s' % (args.node_host, args.node_port)
|
||||
proxy = Proxy(connect_string)
|
||||
|
||||
d = proxy.callRemote(args.rpc_command)
|
||||
d.addCallbacks(print_value, print_error)
|
||||
d.addBoth(lambda _: shut_down())
|
||||
reactor.run()
|
|
@ -1,214 +0,0 @@
|
|||
import logging
|
||||
import requests
|
||||
import miniupnpc
|
||||
import argparse
|
||||
from copy import deepcopy
|
||||
from twisted.internet import reactor, defer
|
||||
from twisted.web import resource
|
||||
from twisted.web.server import Site
|
||||
|
||||
from lbrynet import conf
|
||||
from lbrynet.core.log_support import configure_console
|
||||
from lbrynet.dht.error import TimeoutError
|
||||
conf.initialize_settings()
|
||||
|
||||
log = logging.getLogger("dht tool")
|
||||
configure_console()
|
||||
log.setLevel(logging.INFO)
|
||||
|
||||
from lbrynet.dht.node import Node
|
||||
from lbrynet.dht.contact import Contact
|
||||
from lbrynet.daemon.auth.server import AuthJSONRPCServer
|
||||
from lbrynet.core.utils import generate_id
|
||||
|
||||
def get_external_ip_and_setup_upnp():
|
||||
try:
|
||||
u = miniupnpc.UPnP()
|
||||
u.discoverdelay = 200
|
||||
u.discover()
|
||||
u.selectigd()
|
||||
|
||||
if u.getspecificportmapping(4444, "UDP"):
|
||||
u.deleteportmapping(4444, "UDP")
|
||||
log.info("Removed UPnP redirect for UDP 4444.")
|
||||
u.addportmapping(4444, 'UDP', u.lanaddr, 4444, 'LBRY DHT port', '')
|
||||
log.info("got external ip from upnp")
|
||||
return u.externalipaddress()
|
||||
except Exception:
|
||||
log.exception("derp")
|
||||
r = requests.get('https://api.ipify.org', {'format': 'json'})
|
||||
log.info("got external ip from ipify.org")
|
||||
return r.json()['ip']
|
||||
|
||||
|
||||
class NodeRPC(AuthJSONRPCServer):
|
||||
def __init__(self, lbryid, seeds, node_port, rpc_port):
|
||||
AuthJSONRPCServer.__init__(self, False)
|
||||
self.root = None
|
||||
self.port = None
|
||||
self.seeds = seeds
|
||||
self.node_port = node_port
|
||||
self.rpc_port = rpc_port
|
||||
if lbryid:
|
||||
lbryid = lbryid.decode('hex')
|
||||
else:
|
||||
lbryid = generate_id()
|
||||
self.node_id = lbryid
|
||||
self.external_ip = get_external_ip_and_setup_upnp()
|
||||
self.node_port = node_port
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def setup(self):
|
||||
self.node = Node(node_id=self.node_id, udpPort=self.node_port,
|
||||
externalIP=self.external_ip)
|
||||
hosts = []
|
||||
for hostname, hostport in self.seeds:
|
||||
host_ip = yield reactor.resolve(hostname)
|
||||
hosts.append((host_ip, hostport))
|
||||
log.info("connecting to dht")
|
||||
yield self.node.joinNetwork(tuple(hosts))
|
||||
log.info("connected to dht")
|
||||
if not self.announced_startup:
|
||||
self.announced_startup = True
|
||||
self.start_api()
|
||||
log.info("lbry id: %s (%i bytes)", self.node.node_id.encode('hex'), len(self.node.node_id))
|
||||
|
||||
def start_api(self):
|
||||
root = resource.Resource()
|
||||
root.putChild('', self)
|
||||
self.port = reactor.listenTCP(self.rpc_port, Site(root), interface='localhost')
|
||||
log.info("started jsonrpc server")
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def jsonrpc_node_id_set(self, node_id):
|
||||
old_id = self.node.node_id
|
||||
self.node.stop()
|
||||
del self.node
|
||||
self.node_id = node_id.decode('hex')
|
||||
yield self.setup()
|
||||
msg = "changed dht id from %s to %s" % (old_id.encode('hex'),
|
||||
self.node.node_id.encode('hex'))
|
||||
defer.returnValue(msg)
|
||||
|
||||
def jsonrpc_node_id_get(self):
|
||||
return self._render_response(self.node.node_id.encode('hex'))
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def jsonrpc_peer_find(self, node_id):
|
||||
node_id = node_id.decode('hex')
|
||||
contact = yield self.node.findContact(node_id)
|
||||
result = None
|
||||
if contact:
|
||||
result = (contact.address, contact.port)
|
||||
defer.returnValue(result)
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def jsonrpc_peer_list_for_blob(self, blob_hash):
|
||||
peers = yield self.node.getPeersForBlob(blob_hash.decode('hex'))
|
||||
defer.returnValue(peers)
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def jsonrpc_ping(self, node_id):
|
||||
contact_host = yield self.jsonrpc_peer_find(node_id=node_id)
|
||||
if not contact_host:
|
||||
defer.returnValue("failed to find node")
|
||||
contact_ip, contact_port = contact_host
|
||||
contact = Contact(node_id.decode('hex'), contact_ip, contact_port, self.node._protocol)
|
||||
try:
|
||||
result = yield contact.ping()
|
||||
except TimeoutError:
|
||||
self.node.removeContact(contact.id)
|
||||
self.node._dataStore.removePeer(contact.id)
|
||||
result = {'error': 'timeout'}
|
||||
defer.returnValue(result)
|
||||
|
||||
def get_routing_table(self):
|
||||
result = {}
|
||||
data_store = deepcopy(self.node._dataStore._dict)
|
||||
datastore_len = len(data_store)
|
||||
hosts = {}
|
||||
missing_contacts = []
|
||||
if datastore_len:
|
||||
for k, v in data_store.iteritems():
|
||||
for value, lastPublished, originallyPublished, originalPublisherID in v:
|
||||
try:
|
||||
contact = self.node._routingTable.getContact(originalPublisherID)
|
||||
except ValueError:
|
||||
if originalPublisherID.encode('hex') not in missing_contacts:
|
||||
missing_contacts.append(originalPublisherID.encode('hex'))
|
||||
continue
|
||||
if contact in hosts:
|
||||
blobs = hosts[contact]
|
||||
else:
|
||||
blobs = []
|
||||
blobs.append(k.encode('hex'))
|
||||
hosts[contact] = blobs
|
||||
|
||||
contact_set = []
|
||||
blob_hashes = []
|
||||
result['buckets'] = {}
|
||||
|
||||
for i in range(len(self.node._routingTable._buckets)):
|
||||
for contact in self.node._routingTable._buckets[i]._contacts:
|
||||
contacts = result['buckets'].get(i, [])
|
||||
if contact in hosts:
|
||||
blobs = hosts[contact]
|
||||
del hosts[contact]
|
||||
else:
|
||||
blobs = []
|
||||
host = {
|
||||
"address": contact.address,
|
||||
"id": contact.id.encode("hex"),
|
||||
"blobs": blobs,
|
||||
}
|
||||
for blob_hash in blobs:
|
||||
if blob_hash not in blob_hashes:
|
||||
blob_hashes.append(blob_hash)
|
||||
contacts.append(host)
|
||||
result['buckets'][i] = contacts
|
||||
contact_set.append(contact.id.encode("hex"))
|
||||
if hosts:
|
||||
result['datastore extra'] = [
|
||||
{
|
||||
"id": host.id.encode('hex'),
|
||||
"blobs": hosts[host],
|
||||
}
|
||||
for host in hosts]
|
||||
result['missing contacts'] = missing_contacts
|
||||
result['contacts'] = contact_set
|
||||
result['blob hashes'] = blob_hashes
|
||||
result['node id'] = self.node_id.encode('hex')
|
||||
return result
|
||||
|
||||
def jsonrpc_routing_table_get(self):
|
||||
return self._render_response(self.get_routing_table())
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Launch a dht node which responds to rpc commands")
|
||||
parser.add_argument("--node_port",
|
||||
help=("The UDP port on which the node will listen for connections "
|
||||
"from other dht nodes"),
|
||||
type=int, default=4444)
|
||||
parser.add_argument("--rpc_port",
|
||||
help="The TCP port on which the node will listen for rpc commands",
|
||||
type=int, default=5280)
|
||||
parser.add_argument("--bootstrap_host",
|
||||
help="The IP of a DHT node to be used to bootstrap into the network",
|
||||
default='lbrynet1.lbry.io')
|
||||
parser.add_argument("--node_id",
|
||||
help="The IP of a DHT node to be used to bootstrap into the network",
|
||||
default=None)
|
||||
parser.add_argument("--bootstrap_port",
|
||||
help="The port of a DHT node to be used to bootstrap into the network",
|
||||
default=4444, type=int)
|
||||
|
||||
args = parser.parse_args()
|
||||
seeds = [(args.bootstrap_host, args.bootstrap_port)]
|
||||
server = NodeRPC(args.node_id, seeds, args.node_port, args.rpc_port)
|
||||
reactor.addSystemEventTrigger('after', 'startup', server.setup)
|
||||
reactor.run()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -1,47 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from lbrynet.core import log_support
|
||||
import logging.handlers
|
||||
import sys
|
||||
import time
|
||||
from pprint import pprint
|
||||
|
||||
from twisted.internet import defer, reactor
|
||||
from lbrynet.dht.node import Node
|
||||
import lbrynet.dht.constants
|
||||
import lbrynet.dht.datastore
|
||||
from lbrynet.tests.util import random_lbry_hash
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def run():
|
||||
nodeid = "9648996b4bef3ff41176668a0577f86aba7f1ea2996edd18f9c42430802c8085331345c5f0c44a7f352e2ba8ae59aaaa".decode("hex")
|
||||
node = Node(node_id=nodeid, externalIP='127.0.0.1', udpPort=21999, peerPort=1234)
|
||||
node.startNetwork()
|
||||
yield node.joinNetwork([("127.0.0.1", 21001)])
|
||||
|
||||
print ""
|
||||
print ""
|
||||
print ""
|
||||
print ""
|
||||
print ""
|
||||
print ""
|
||||
|
||||
yield node.announceHaveBlob("2bb150cb996b4bef3ff41176648a0577f86abb7f1ea2996edd18f9c42430802c8085331345c5f0c44a7f352e2ba8ae59".decode("hex"))
|
||||
|
||||
log.info("Shutting down...")
|
||||
reactor.callLater(1, reactor.stop)
|
||||
|
||||
|
||||
def main():
|
||||
log_support.configure_console(level='DEBUG')
|
||||
log_support.configure_twisted()
|
||||
reactor.callLater(0, run)
|
||||
log.info("Running reactor")
|
||||
reactor.run()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
Loading…
Reference in a new issue