|
70 | 70 |
|
71 | 71 |
|
72 | 72 | class AlgaeClient: |
73 | | - def __init__(self, address: str, port: int, dns: IPv4Address = _DEFAULT_CURRENT_DNS, protocol: Optional[Union[Literal["typhoon"], Literal["port"]]] = None, capture_iface: Optional[List[str]] = None, capture_ranges: Optional[List[str]] = None, capture_addresses: Optional[List[str]] = None, capture_ports: Optional[str] = None, exempt_ranges: Optional[List[str]] = None, exempt_addresses: Optional[List[str]] = None, exempt_ports: Optional[str] = None, local_address: Optional[IPv4Address] = None): |
74 | | - self._address = address |
75 | | - self._port = port |
| 73 | + def __init__(self) -> None: |
| 74 | + self._address: str |
| 75 | + self._port: int |
| 76 | + self._proto_type: SeasideClient |
| 77 | + self._tunnel: Tunnel |
| 78 | + |
| 79 | + @classmethod |
| 80 | + async def new(cls, address: str, port: int, dns: IPv4Address = _DEFAULT_CURRENT_DNS, protocol: Optional[Union[Literal["typhoon"], Literal["port"]]] = None, capture_iface: Optional[List[str]] = None, capture_ranges: Optional[List[str]] = None, capture_addresses: Optional[List[str]] = None, capture_ports: Optional[str] = None, exempt_ranges: Optional[List[str]] = None, exempt_addresses: Optional[List[str]] = None, exempt_ports: Optional[str] = None, local_address: Optional[IPv4Address] = None) -> "AlgaeClient": |
| 81 | + client = cls() |
| 82 | + client._address = address |
| 83 | + client._port = port |
76 | 84 |
|
77 | 85 | if protocol is None or protocol == "port": |
78 | | - self._proto_type = PortClient |
| 86 | + client._proto_type = PortClient |
79 | 87 | elif protocol == "typhoon": |
80 | | - self._proto_type = TyphoonClient |
| 88 | + client._proto_type = TyphoonClient |
81 | 89 | else: |
82 | 90 | raise ValueError(f"Unknown protocol type: {protocol}") |
83 | 91 |
|
84 | 92 | tunnel_name = getenv("SEASIDE_TUNNEL_NAME", _DEFAULT_TUNNEL_NAME) |
85 | 93 | tunnel_address = IPv4Address(getenv("SEASIDE_TUNNEL_ADDRESS", _DEFAULT_TUNNEL_ADDRESS)) |
86 | 94 | tunnel_netmask = IPv4Address(getenv("SEASIDE_TUNNEL_NETMASK", _DEFAULT_TUNNEL_NETMASK)) |
87 | 95 | tunnel_sva = int(getenv("SEASIDE_TUNNEL_SVA", _DEFAULT_TUNNEL_SVA)) |
88 | | - self._tunnel = Tunnel(tunnel_name, tunnel_address, tunnel_netmask, tunnel_sva, IPv4Address(self._address), dns, capture_iface, capture_ranges, capture_addresses, capture_ports, exempt_ranges, exempt_addresses, exempt_ports, local_address) |
| 96 | + client._tunnel = await Tunnel.new(tunnel_name, tunnel_address, tunnel_netmask, tunnel_sva, IPv4Address(client._address), dns, capture_iface, capture_ranges, capture_addresses, capture_ports, exempt_ranges, exempt_addresses, exempt_ports, local_address) |
| 97 | + return client |
89 | 98 |
|
90 | 99 | async def _send_to_caerulean(self, connection: SeasideClient, tunnel: int) -> None: |
91 | 100 | loop = get_running_loop() |
@@ -163,7 +172,7 @@ async def start(self, command: str, port: Optional[str] = None, token: Optional[ |
163 | 172 |
|
164 | 173 | async def interrupt(self, terminate: bool = False) -> None: |
165 | 174 | logger.debug("Deleting tunnel...") |
166 | | - self._tunnel.delete() |
| 175 | + await self._tunnel.delete() |
167 | 176 | logger.warning("Client connection terminated!") |
168 | 177 | if terminate: |
169 | 178 | exit(1) |
@@ -216,7 +225,7 @@ async def main(args: Sequence[str] = argv[1:]) -> None: |
216 | 225 | logger.debug(f"Proceeding with user token: {token!r}") |
217 | 226 | listener_port = arguments["port"] |
218 | 227 |
|
219 | | - client = AlgaeClient(**arguments) |
| 228 | + client = await AlgaeClient.new(**arguments) |
220 | 229 | logger.debug("Setting up interruption handlers for client...") |
221 | 230 | loop.add_signal_handler(SIGTERM, lambda: create_task(client.interrupt(True))) |
222 | 231 | loop.add_signal_handler(SIGINT, lambda: create_task(client.interrupt(True))) |
|
0 commit comments