diff --git a/swarm/ConnectionManager.py b/swarm/ConnectionManager.py index 6b62ee9fd5ead53f36a2236159bb557315032e0a..3d6753cb7b72fd96e0a21fda57421c3b3548b957 100644 --- a/swarm/ConnectionManager.py +++ b/swarm/ConnectionManager.py @@ -2,12 +2,11 @@ import socket import socketserver import time import threading -from enum import Enum -import re from functools import partial from typing import List, Callable, Optional, Tuple -from swarm.ConnectionManagerTCPHandler import ConnectionManagerTCPHandler +from .statics import StandardMessages, MessageToBig, _string_to_ip_and_port +from .ConnectionManagerTCPHandler import ConnectionManagerTCPHandler try: from time import time_ns @@ -19,36 +18,6 @@ except ImportError: return int(now.timestamp() * 1e9) -class StandardMessages(Enum): - ANNOUNCE = "announce" - UPDATE_LAUNCH = "update" - ACKNOWLEDGED = "acknowledged" - HEARTBEAT = "heartbeat" - GET_ADDRESSES = "addresses" - GET_MASTER = "master" - - -class MessageToBig(Exception): - pass - - -class InvalidIPString(Exception): - pass - - -def _string_to_ip_and_port(message: str) -> Tuple[str, int]: - valid_ipv4 = re.compile(r"^(\d?\d?\d.){3}\d?\d?\d:(\d?){4}\d$") - valid_ipv6 = re.compile(r"^([a-f\d:]+:+)+[a-f\d]+:(\d?){4}\d$") - valid_address = re.compile(r"^(localhost)|(\*+.\*):(\d?){4}\d$") - if (not valid_ipv4.match(message)) and (not valid_ipv6.match(message)) and (not valid_address.match(message)): - raise InvalidIPString(f"'{message}' is not an valid ip address") - msg_split = message.split(":") - port = msg_split[-1] - ip = ":".join(msg_split[0:-1]) - port = int(port) - return ip, port - - class ConnectionManager: def __init__(self, addr="localhost", diff --git a/swarm/ConnectionManagerTCPHandler.py b/swarm/ConnectionManagerTCPHandler.py index 8605a21ba1172f8e66c117a9de2e917feb254bc1..bf6ca1d620c11c9f0b363ccf2f8b0a018baafb05 100644 --- a/swarm/ConnectionManagerTCPHandler.py +++ b/swarm/ConnectionManagerTCPHandler.py @@ -2,7 +2,7 @@ import socket import socketserver from typing import Union -from swarm import _string_to_ip_and_port, StandardMessages +from .statics import _string_to_ip_and_port, StandardMessages class ConnectionManagerTCPHandler(socketserver.BaseRequestHandler): diff --git a/swarm/__init__.py b/swarm/__init__.py index 5f7d96d02195942168f424a4a82e6db60b4396ab..04a135a8ff668e54b50a60b10e86e8185ab52ffd 100644 --- a/swarm/__init__.py +++ b/swarm/__init__.py @@ -8,6 +8,6 @@ __author__ = 'Joris Wachsmuth' from .ConnectionManager import\ ConnectionManager,\ StandardMessages,\ - InvalidIPString,\ MessageToBig,\ _string_to_ip_and_port +from .statics import InvalidIPString diff --git a/swarm/statics.py b/swarm/statics.py new file mode 100644 index 0000000000000000000000000000000000000000..e5bb6253ea0aa9d14368484b6ec0971fb46abe60 --- /dev/null +++ b/swarm/statics.py @@ -0,0 +1,33 @@ +import re +from enum import Enum +from typing import Tuple + + +class StandardMessages(Enum): + ANNOUNCE = "announce" + UPDATE_LAUNCH = "update" + ACKNOWLEDGED = "acknowledged" + HEARTBEAT = "heartbeat" + GET_ADDRESSES = "addresses" + GET_MASTER = "master" + + +class MessageToBig(Exception): + pass + + +class InvalidIPString(Exception): + pass + + +def _string_to_ip_and_port(message: str) -> Tuple[str, int]: + valid_ipv4 = re.compile(r"^(\d?\d?\d.){3}\d?\d?\d:(\d?){4}\d$") + valid_ipv6 = re.compile(r"^([a-f\d:]+:+)+[a-f\d]+:(\d?){4}\d$") + valid_address = re.compile(r"^(localhost)|(\*+.\*):(\d?){4}\d$") + if (not valid_ipv4.match(message)) and (not valid_ipv6.match(message)) and (not valid_address.match(message)): + raise InvalidIPString(f"'{message}' is not an valid ip address") + msg_split = message.split(":") + port = msg_split[-1] + ip = ":".join(msg_split[0:-1]) + port = int(port) + return ip, port diff --git a/tests/test_connection_manager.py b/tests/test_connection_manager.py index fe15486c8462c412f827a056c227ba4d857be571..c465f337d5efc64063a2cd618a921687cdae7242 100644 --- a/tests/test_connection_manager.py +++ b/tests/test_connection_manager.py @@ -6,27 +6,29 @@ import socket from ipaddress import IPv4Address, IPv6Address from typing import List +import swarm.statics + class TestStatics(TestCase): def test_ipv4_str_parsing(self): for i in range(1000): addr_str = str(IPv4Address(random.getrandbits(32))) port = random.randint(1, 65535) - (ip, port_e) = swarm._string_to_ip_and_port(addr_str + ":" + str(port)) + (ip, port_e) = swarm.statics._string_to_ip_and_port(addr_str + ":" + str(port)) self.assertEqual((ip, port_e), (addr_str, port)) def test_ipv6_str_parsing(self): for i in range(1000): addr_str = str(IPv6Address(random.getrandbits(128))) port = random.randint(1, 65535) - (ip, port_e) = swarm._string_to_ip_and_port(addr_str + ":" + str(port)) + (ip, port_e) = swarm.statics._string_to_ip_and_port(addr_str + ":" + str(port)) self.assertEqual((ip, port_e), (addr_str, port)) def test_invalid_str_parsing(self): invalid_sting = "invalid" try: - swarm._string_to_ip_and_port(invalid_sting) - except swarm.InvalidIPString: + swarm.statics._string_to_ip_and_port(invalid_sting) + except swarm.statics.InvalidIPString: return self.assertTrue(False) @@ -51,7 +53,7 @@ class TestConnections(TestCase): conn_mans[ip_str].connect(to_connect) to_connect.append(ip_str) - master = swarm._string_to_ip_and_port(to_connect[0]) + master = swarm.statics._string_to_ip_and_port(to_connect[0]) for manager in conn_mans.values(): self.assertEqual(master, manager.get_current_master()) for manager in conn_mans.values():