diff --git a/RNS/Discovery.py b/RNS/Discovery.py index 08d66515..796424b3 100644 --- a/RNS/Discovery.py +++ b/RNS/Discovery.py @@ -2,6 +2,7 @@ import os import RNS import time import threading +import subprocess from .vendor import umsgpack as msgpack NAME = 0xFF @@ -102,8 +103,24 @@ class InterfaceAnnouncer(): LONGITUDE: interface.discovery_longitude, HEIGHT: interface.discovery_height} + reachable_on = self.sanitize(interface.reachable_on) + if not RNS.vendor.platformutils.is_windows(): + try: + exec_path = os.path.expanduser(reachable_on) + if os.path.isfile(exec_path) and os.access(exec_path, os.X_OK): + RNS.log(f"Evaluating reachable_on from executable at {exec_path}", RNS.LOG_DEBUG) + exec_result = subprocess.run([exec_path], stdout=subprocess.PIPE) + exec_stdout = exec_result.stdout.decode("utf-8") + if exec_result.returncode != 0: raise ValueError("Non-zero exit code from subprocess") + reachable_on = self.sanitize(exec_stdout) + + except Exception as e: + RNS.log(f"Error while getting reachable_on from executable at {interface.reachable_on}: {e}", RNS.LOG_ERROR) + RNS.log(f"Aborting discovery announce", RNS.LOG_ERROR) + return None + if interface_type in ["BackboneInterface", "TCPServerInterface"]: - info[REACHABLE_ON] = self.sanitize(interface.reachable_on) + info[REACHABLE_ON] = reachable_on info[PORT] = interface.bind_port if interface_type == "I2PInterface" and interface.connectable and interface.b32: