Ejemplo n.º 1
0
    def _run(self):
        log.info('waiting for bootstrap')
        gevent.sleep(3)
        loop_delay = 1
        while not self.is_stopped:
            #log.info('in loop', num_peers=len(self.peers))
            num_peers, min_peers = self.num_peers(
            ), self.config['p2p']['min_peers']
            kademlia_proto = self.app.services.discovery.protocol.kademlia
            if num_peers < min_peers:
                log.info('missing peers',
                         num_peers=num_peers,
                         min_peers=min_peers,
                         known=len(kademlia_proto.routing))
                nodeid = kademlia.random_nodeid()
                kademlia_proto.find_node(nodeid)  # fixme, should be a task
                gevent.sleep(2)  # wait for results
                neighbours = kademlia_proto.routing.neighbours(nodeid, 1)
                node = neighbours[0]
                log.info('connecting random', node=node)
                local_pubkey = crypto.privtopub(
                    self.config['node']['privkey_hex'].decode('hex'))
                if node.pubkey == local_pubkey:
                    continue
                if node.pubkey in [p.remote_pubkey for p in self.peers]:
                    continue
                self.connect((node.address.ip, node.address.port), node.pubkey)
            gevent.sleep(loop_delay)

        evt = gevent.event.Event()
        evt.wait()
Ejemplo n.º 2
0
    def _run(self):
        log.info('waiting for bootstrap')
        gevent.sleep(3)
        loop_delay = 1
        while not self.is_stopped:
            #log.info('in loop', num_peers=len(self.peers))
            num_peers, min_peers = self.num_peers(), self.config['p2p']['min_peers']
            kademlia_proto = self.app.services.discovery.protocol.kademlia
            if num_peers < min_peers:
                log.info('missing peers', num_peers=num_peers,
                         min_peers=min_peers, known=len(kademlia_proto.routing))
                nodeid = kademlia.random_nodeid()
                kademlia_proto.find_node(nodeid)  # fixme, should be a task
                gevent.sleep(2)  # wait for results
                neighbours = kademlia_proto.routing.neighbours(nodeid, 1)
                node = neighbours[0]
                log.info('connecting random', node=node)
                local_pubkey = crypto.privtopub(self.config['node']['privkey_hex'].decode('hex'))
                if node.pubkey == local_pubkey:
                    continue
                if node.pubkey in [p.remote_pubkey for p in self.peers]:
                    continue
                self.connect((node.address.ip, node.address.tcp_port), node.pubkey)
            gevent.sleep(loop_delay)

        evt = gevent.event.Event()
        evt.wait()
Ejemplo n.º 3
0
    def __init__(self, app):
        log.info('PeerManager init')
        self.peers = []
        self.errors = PeerErrors()
        WiredService.__init__(self, app)

        # setup nodeid based on privkey
        if 'id' not in self.config['p2p']:
            self.config['node']['id'] = crypto.privtopub(
                self.config['node']['privkey_hex'].decode('hex'))
Ejemplo n.º 4
0
    def __init__(self, app):
        log.info('PeerManager init')
        self.peers = []
        self.errors = PeerErrors()
        WiredService.__init__(self, app)

        # setup nodeid based on privkey
        if 'id' not in self.config['p2p']:
            self.config['node']['id'] = crypto.privtopub(
                self.config['node']['privkey_hex'].decode('hex'))
Ejemplo n.º 5
0
def main():
    alice_privkey = mk_privkey('secret1')
    alice_pubkey = privtopub(alice_privkey)
    print len(alice_pubkey), type(alice_pubkey)
    alice = LocalNode(alice_pubkey, alice_privkey)

    bob_privkey = mk_privkey('secret2')
    bob_pubkey = privtopub(bob_privkey)
    bob = LocalNode(bob_pubkey, bob_privkey)

    def _receivecb(peer, data):
        print peer, data

    # alice knows bob and connects
    node_bob = RemoteNode(bob_pubkey)
    peer_alice = Peer(alice, transport=None, receive_cb=_receivecb)
    peer_bob = Peer(bob, transport=None, receive_cb=_receivecb)
    peer_alice.transport = Transport(sender=peer_alice, receiver=peer_bob)
    peer_bob.transport = Transport(sender=peer_bob, receiver=peer_alice)

    peer_alice.connect(peer_bob)
Ejemplo n.º 6
0
    def __init__(self, app):
        log.info('PeerManager init')
        WiredService.__init__(self, app)
        self.peers = []
        self.errors = PeerErrors(
        ) if self.config['log_disconnects'] else PeerErrorsBase()

        # setup nodeid based on privkey
        if 'id' not in self.config['p2p']:
            self.config['node']['id'] = crypto.privtopub(
                self.config['node']['privkey_hex'].decode('hex'))

        self.listen_addr = (self.config['p2p']['listen_host'],
                            self.config['p2p']['listen_port'])
        self.server = StreamServer(self.listen_addr,
                                   handle=self._on_new_connection)
Ejemplo n.º 7
0
    def __init__(self, app):
        log.info('PeerManager init')
        WiredService.__init__(self, app)
        self.peers = []
        self.errors = PeerErrors(
        ) if self.config['log_disconnects'] else PeerErrorsBase()
        self.result_dir = self.config["result_dir"] if self.config[
            "result_dir"] != "" else self.result_dir
        self.prev_routing_table = self.config[
            "prev_routing_table"] if self.config[
                "prev_routing_table"] != "" else self.prev_routing_table
        self.prev_peers = self.config["prev_peers"] if self.config[
            "prev_peers"] != "" else self.prev_peers

        # setup nodeid based on privkey
        print self.config
        if 'id' not in self.config['p2p']:
            self.config['node']['id'] = crypto.privtopub(
                self.config['node']['privkey_hex'].decode('hex'))

        self.listen_addr = (self.config['p2p']['listen_host'],
                            self.config['p2p']['listen_port'])
Ejemplo n.º 8
0
    def _discovery_loop(self):
        log.info('waiting for bootstrap')
        gevent.sleep(self.discovery_delay)
        while not self.is_stopped:
            num_peers, min_peers = self.num_peers(
            ), self.config['p2p']['min_peers']
            try:
                kademlia_proto = self.app.services.discovery.protocol.kademlia
            except AttributeError:
                # TODO: Is this the correct thing to do here?
                log.error("Discovery service not available.")
                break
            if num_peers < min_peers:
                log.debug('missing peers',
                          num_peers=num_peers,
                          min_peers=min_peers,
                          known=len(kademlia_proto.routing))
                nodeid = kademlia.random_nodeid()
                kademlia_proto.find_node(nodeid)  # fixme, should be a task
                gevent.sleep(self.discovery_delay)  # wait for results
                neighbours = kademlia_proto.routing.neighbours(nodeid, 2)
                if not neighbours:
                    gevent.sleep(self.connect_loop_delay)
                    continue
                node = random.choice(neighbours)
                log.debug('connecting random', node=node)
                local_pubkey = crypto.privtopub(
                    self.config['node']['privkey_hex'].decode('hex'))
                if node.pubkey == local_pubkey:
                    continue
                if node.pubkey in [p.remote_pubkey for p in self.peers]:
                    continue
                self.connect((node.address.ip, node.address.tcp_port),
                             node.pubkey)
            gevent.sleep(self.connect_loop_delay)

        evt = gevent.event.Event()
        evt.wait()
Ejemplo n.º 9
0
Archivo: app.py Proyecto: jnnk/pydevp2p
    num_peers: 10
    bootstrap_nodes:
        # local bootstrap
        # - enode://6ed2fecb28ff17dec8647f08aa4368b57790000e0e9b33a7b91f32c41b6ca9ba21600e9a8c44248ce63a71544388c6745fa291f88f8b81e109ba3da11f7b41b9@127.0.0.1:30303
        # go_bootstrap
        - enode://6cdd090303f394a1cac34ecc9f7cda18127eafa2a3a06de39f6d920b0e583e062a7362097c7c65ee490a758b442acd5c80c6fce4b148c6a391e946b45131365b@54.169.166.226:30303
        # cpp_bootstrap
        #- enode://4a44599974518ea5b0f14c31c4463692ac0329cb84851f3435e6d1b18ee4eae4aa495f846a0fa1219bd58035671881d44423876e57db2abd57254d0197da0ebe@5.1.83.226:30303

    listen_host: 0.0.0.0
    listen_port: 30303
    privkey_hex: 65462b0520ef7d3df61b9992ed3bea0c56ead753be7c8b3614e0ce01e4cac41b
    """
    if len(sys.argv) == 1:
        config = yaml.load(io.BytesIO(sample_config))
        pubkey = crypto.privtopub(config['p2p']['privkey_hex'].decode('hex'))
        config['p2p']['node_id'] = crypto.sha3(pubkey)
    else:
        fn = sys.argv[1]
        log.info('loading config from', fn=fn)
        config = yaml.load(open(fn))

    print config
    # create app
    app = BaseApp(config)

    # register services
    NodeDiscovery.register_with_app(app)
    PeerManager.register_with_app(app)
    #  JSONRPCServer.register_with_app(app)
Ejemplo n.º 10
0
def main():
    # config
    import yaml
    import io
    import sys
    import signal
    import gevent
    from peermanager import PeerManager
    from jsonrpc import JSONRPCServer
    from discovery import NodeDiscovery
    import slogging
    log = slogging.get_logger('app')
    slogging.configure(config_string=':debug')

    # read config
    sample_config = """
p2p:
    num_peers: 10
    bootstrap_nodes:
        # local bootstrap
        # - enode://6ed2fecb28ff17dec8647f08aa4368b57790000e0e9b33a7b91f32c41b6ca9ba21600e9a8c44248ce63a71544388c6745fa291f88f8b81e109ba3da11f7b41b9@127.0.0.1:30303
        # go_bootstrap
        #- enode://6cdd090303f394a1cac34ecc9f7cda18127eafa2a3a06de39f6d920b0e583e062a7362097c7c65ee490a758b442acd5c80c6fce4b148c6a391e946b45131365b@54.169.166.226:30303
        # cpp_bootstrap
        - enode://4a44599974518ea5b0f14c31c4463692ac0329cb84851f3435e6d1b18ee4eae4aa495f846a0fa1219bd58035671881d44423876e57db2abd57254d0197da0ebe@5.1.83.226:30303

    listen_host: 0.0.0.0
    listen_port: 30303
node:
    privkey_hex: 65462b0520ef7d3df61b9992ed3bea0c56ead753be7c8b3614e0ce01e4cac41b
    """
    if len(sys.argv) == 1:
        config = yaml.load(io.BytesIO(sample_config))
        pubkey = crypto.privtopub(config['node']['privkey_hex'].decode('hex'))
        config['node']['id'] = crypto.sha3(pubkey)
    else:
        fn = sys.argv[1]
        log.info('loading config from', fn=fn)
        config = yaml.load(open(fn))

    # stop on every unhandled exception!
    gevent.get_hub().SYSTEM_ERROR = BaseException  # (KeyboardInterrupt, SystemExit, SystemError)

    print config
    # create app
    app = BaseApp(config)

    # register services
    NodeDiscovery.register_with_app(app)
    PeerManager.register_with_app(app)
    #  JSONRPCServer.register_with_app(app)

    # start app
    app.start()

    # wait for interupt
    evt = gevent.event.Event()
    # gevent.signal(signal.SIGQUIT, gevent.kill) ## killall pattern
    gevent.signal(signal.SIGQUIT, evt.set)
    gevent.signal(signal.SIGTERM, evt.set)
    gevent.signal(signal.SIGINT, evt.set)
    evt.wait()

    # finally stop
    app.stop()