From fe2866bc34c20cff386aa81799f756c8135af4ce Mon Sep 17 00:00:00 2001 From: daveecode Date: Wed, 27 Apr 2022 20:24:51 +0200 Subject: [PATCH] Add logging and multi threading --- main.py | 5 ++++- run.sh | 3 +++ tracker.py | 38 +++++++++++++++++++++++++++++--------- 3 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 run.sh diff --git a/main.py b/main.py index 3f161b8..dd7f7f5 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,7 @@ import logging import os import message +import sys class Run(object): @@ -17,7 +18,7 @@ class Run(object): last_log_line = "" def __init__(self): - self.torrent = torrent.Torrent().load_from_path("torrent.torrent") + self.torrent = torrent.Torrent().load_from_path(os.path.join('torrents', sys.argv[1])) self.tracker = tracker.Tracker(self.torrent) self.pieces_manager = pieces_manager.PiecesManager(self.torrent) @@ -92,11 +93,13 @@ def display_progression(self): def _exit_threads(self): self.peers_manager.is_active = False + logging.info(f"Downloading finished in: {time.time() - start_time} seconds") os._exit(0) if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) + start_time = time.time() run = Run() run.start() diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..18c8783 --- /dev/null +++ b/run.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +echo "Redirecting all logs into ./torrents/$1.log" +python3 main.py $1 2>&1 | tee "./torrents/$1.log" diff --git a/tracker.py b/tracker.py index b6a8a25..48dab45 100644 --- a/tracker.py +++ b/tracker.py @@ -3,6 +3,7 @@ import peer from message import UdpTrackerConnection, UdpTrackerAnnounce, UdpTrackerAnnounceOutput from peers_manager import PeersManager +from threading import Thread __author__ = 'alexisgallepe' @@ -15,7 +16,6 @@ MAX_PEERS_TRY_CONNECT = 30 MAX_PEERS_CONNECTED = 8 - class SockAddr: def __init__(self, ip, port, allowed=True): self.ip = ip @@ -34,6 +34,10 @@ def __init__(self, torrent): self.dict_sock_addr = {} def get_peers_from_trackers(self): + logging.info("---------------------------------------") + logging.info(f"Trackers: {self.torrent.announce_list}") + logging.info("---------------------------------------") + for i, tracker in enumerate(self.torrent.announce_list): if len(self.dict_sock_addr) >= MAX_PEERS_TRY_CONNECT: break @@ -51,7 +55,6 @@ def get_peers_from_trackers(self): self.udp_scrapper(tracker_url) except Exception as e: logging.error("UDP scraping failed: %s " % e.__str__()) - else: logging.error("unknown scheme for: %s " % tracker_url) @@ -62,17 +65,26 @@ def get_peers_from_trackers(self): def try_peer_connect(self): logging.info("Trying to connect to %d peer(s)" % len(self.dict_sock_addr)) + def task(obj): + new_peer = peer.Peer(int(self.torrent.number_of_pieces), sock_addr.ip, sock_addr.port) + if not new_peer.connect(): + return + obj.connected_peers[new_peer.__hash__()] = new_peer + print('Connected to %d/%d peers' % (len(obj.connected_peers), MAX_PEERS_CONNECTED)) + + threads = [] + for _, sock_addr in self.dict_sock_addr.items(): if len(self.connected_peers) >= MAX_PEERS_CONNECTED: break + t = Thread(target=task, args=(self,)) + threads.append(t) + t.start() - new_peer = peer.Peer(int(self.torrent.number_of_pieces), sock_addr.ip, sock_addr.port) - if not new_peer.connect(): - continue + for t in threads: + t.join() - print('Connected to %d/%d peers' % (len(self.connected_peers), MAX_PEERS_CONNECTED)) - - self.connected_peers[new_peer.__hash__()] = new_peer + logging.info("Finished connecting to peers") def http_scraper(self, torrent, tracker): params = { @@ -112,6 +124,11 @@ def http_scraper(self, torrent, tracker): s = SockAddr(p['ip'], p['port']) self.dict_sock_addr[s.__hash__()] = s + logging.info("---------------------------------------") + logging.info(f"Got {len(list_peers.values())} peers from tracker: {tracker}") + logging.info("All peers: %d" % len(self.dict_sock_addr)) + logging.info("---------------------------------------") + except Exception as e: logging.exception("HTTP scraping failed: %s" % e.__str__()) @@ -152,7 +169,10 @@ def udp_scrapper(self, announce): if sock_addr.__hash__() not in self.dict_sock_addr: self.dict_sock_addr[sock_addr.__hash__()] = sock_addr - print("Got %d peers" % len(self.dict_sock_addr)) + logging.info("---------------------------------------") + logging.info(f"Got {len(tracker_announce_output.list_sock_addr)} peers from tracker: {announce}") + logging.info("All peers: %d" % len(self.dict_sock_addr)) + logging.info("---------------------------------------") def send_message(self, conn, sock, tracker_message): message = tracker_message.to_bytes()