From 1e76990d1e64f459ba51539f15c42be75845a2ad Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 17 Jun 2020 00:00:52 -0500 Subject: [PATCH] made lan port identification faster --- src/lan/__init__.py | 3 +- src/lan/client/__init__.py | 79 ++++++++++++------------------------- src/lan/discover.py | 5 ++- src/onionrtypes/__init__.py | 2 + 4 files changed, 32 insertions(+), 57 deletions(-) diff --git a/src/lan/__init__.py b/src/lan/__init__.py index 15a106f4..f900a889 100644 --- a/src/lan/__init__.py +++ b/src/lan/__init__.py @@ -7,7 +7,6 @@ from threading import Thread if TYPE_CHECKING: from toomanyobjs import TooMany -from .client import Client from .discover import learn_services, advertise_service """ This program is free software: you can redistribute it and/or modify @@ -34,6 +33,6 @@ class LANManager: def start(self): - Thread(target=learn_services, args=[self.too_many.get(Client)], daemon=True).start() + Thread(target=learn_services, daemon=True).start() Thread(target=advertise_service, daemon=True).start() diff --git a/src/lan/client/__init__.py b/src/lan/client/__init__.py index 77562cac..bf3d1377 100644 --- a/src/lan/client/__init__.py +++ b/src/lan/client/__init__.py @@ -2,17 +2,14 @@ LAN transport client thread """ -from typing import List +import requests -import watchdog -from requests.exceptions import ConnectionError +from typing import Set -from onionrcrypto.cryptoutils.randomshuffle import random_shuffle +from onionrtypes import LANIP from utils.bettersleep import better_sleep -from onionrutils.basicrequests import do_post_request, do_get_request + from threading import Thread -from onionrblocks import BlockList -from onionrblocks.blockimporter import import_block_from_data """ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,53 +25,29 @@ from onionrblocks.blockimporter import import_block_from_data along with this program. If not, see . """ - -class Client: - def __init__(self): - self.peers = [] - self.lookup_time = {} - self.poll_delay = 10 +connected_lan_peers: Set[LANIP] = set([]) - def get_lookup_time(self, peer): - try: - return self.lookup_time[peer] - except KeyError: - return 0 +def _lan_work(peer: LANIP): + identified_port = lambda: None + identified_port.port = 0 + def find_port(start=1024, max=0): + for i in range(start, 65535): + if i > max and max > 0: + break + if identified_port.port != 0: + break + if requests.get(f'http://{peer}/:{i}/ping') == 'pong!': + identified_port.port = i + break + + Thread(target=find_port, args=[1024, 32767], daemon=True).start() + Thread(target=find_port, args=[32767, 65535], daemon=True).start() + while identified_port.port == 0: + better_sleep(1) + print(LANIP, identified_port.port) - def peer_work(self, peer): - port = 1024 - - self.peers.append(peer) - for port in range(port, 65535): - print(port) - try: - if do_get_request(f'http://{peer}:{port}/ping', proxyType='lan', ignoreAPI=True, connect_timeout=0.3) == 'onionr!': - port = port - print(f'{peer}:{port} found') - break - except (AttributeError, ConnectionError): - pass - else: - self.peers.remove(peer) - return - self.peers.append(peer) - - while True: - block_list = self._too_many.get(BlockList).get() - last_time = self.get_lookup_time(peer) - new_blocks = set('\n'.join(do_get_request(f'http://{peer}:{port}/blist/{last_time}', proxyType='lan', ignoreAPI=True))) ^ set(block_list) - - for bl in new_blocks: - import_block_from_data( - do_get_request( - f'http://{peer}:{port}/get/{bl}', proxyType='lan', ignoreAPI=True)) - better_sleep(10) - self.peers.remove(peer) - - def connect_peer(self, peer): - if peer in self.peers: - return - print(f'connecting to {peer}') - Thread(target=self.peer_work, args=[peer], daemon=True).start() +def connect_peer(peer: LANIP): + Thread(target=_lan_work, args=[peer], daemon=True).start() + connected_lan_peers.add(peer) diff --git a/src/lan/discover.py b/src/lan/discover.py index b7a0915a..52ac1b46 100644 --- a/src/lan/discover.py +++ b/src/lan/discover.py @@ -11,6 +11,7 @@ from socket import SHUT_RDWR from .getip import lan_ips, best_ip from utils.bettersleep import better_sleep +from . import client """ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,7 +33,7 @@ ANNOUNCE_LOOP_SLEEP = 30 -def learn_services(lan_client): +def learn_services(): """Take a list to infintely add lan service info to.""" sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) @@ -62,7 +63,7 @@ def learn_services(lan_client): except ValueError: pass else: - lan_client.connect_peer(service) + client.connect_peer(service) def advertise_service(specific_ips=None): diff --git a/src/onionrtypes/__init__.py b/src/onionrtypes/__init__.py index f3ccf88f..ebfe109b 100644 --- a/src/onionrtypes/__init__.py +++ b/src/onionrtypes/__init__.py @@ -3,6 +3,8 @@ from typing import NewType UserID = NewType('UserID', str) UserIDSecretKey = NewType('UserIDSecretKey', str) +LANIP = NewType('LANIP', 'str') + DeterministicKeyPassphrase = NewType('DeterministicKeyPassphrase', str) BlockHash = NewType('BlockHash', str)