def get_app_command(self, db: Session, port: Port): command = port.forward_rule.config.get("command") remote_address = port.forward_rule.config.get("remote_address") if command.endswith(("relay", "client")): remote_ip = dns_query(remote_address) port.forward_rule.config['remote_ip'] = remote_ip db.add(port.forward_rule) db.commit() if is_ipv6(remote_ip): remote_ip = f"[{remote_ip}]" if command == "relay": args = ( f"{command} " f"-f :{port.num} " f"-t {remote_ip}:{port.forward_rule.config.get('remote_port')}" ) elif command.endswith("server"): args = f"{command} -l :{port.num} -p {port.forward_rule.config.get('password')}" elif command.endswith("client"): server_address = port.forward_rule.config.get("server_address") if is_ipv6(server_address): server_address = f"[{server_address}]" server_port = port.forward_rule.config.get("server_port") remote_port = port.forward_rule.config.get("remote_port") password = port.forward_rule.config.get("password") args = (f"relayoverbrook -f :{port.num} " f"-t {remote_ip}:{remote_port} " f"-p {password} " f"-s {'ws://' if command == 'wsclient' else ''}" f"{server_address}:{server_port}") return f"/usr/local/bin/brook {args}"
class TinyPortMapperConfig(AppConfig): method = MethodEnum.TINY_PORT_MAPPER def __init__(self): super().__init__() self.app_name = "tiny_port_mapper" self.app_path = "/usr/local/bin/" self.app_version_arg = "-h" self.app_sync_role_name = "tiny_port_mapper_sync" def apply(self, db: Session, port: Port): self.local_port = port.num self.app_command = self.get_app_command(db, port) self.update_app = not port.server.config.get("tiny_port_mapper") self.applied = True return self def get_app_command(self, db: Session, port: Port): if remote_address := port.forward_rule.config.get("remote_address"): remote_ip = dns_query(remote_address) port.forward_rule.config['remote_ip'] = remote_ip db.add(port.forward_rule) db.commit() if is_ipv6(remote_ip): remote_ip = f"[{remote_ip}]" relay_type = port.forward_rule.config.get('type') args = ( f"--log-level 3 " f"--disable-color " f"-l [::]:{port.num} " f"-r {remote_ip}:{port.forward_rule.config.get('remote_port')} " f"{'-t ' if relay_type == 'ALL' or relay_type == 'TCP' else ''}" f"{'-u ' if relay_type == 'ALL' or relay_type == 'UDP' else ''}") return f"/usr/local/bin/tiny_port_mapper {args}"
def dns_query(hostname: str) -> Optional[str]: hostname = hostname.strip() if not hostname: return None elif is_ip(hostname) or is_ipv6(hostname): return hostname if result := get_ipv4(hostname): return result
def get_app_command(self, db: Session, port: Port): remote_port = port.forward_rule.config.get('remote_port') remote_address = port.forward_rule.config.get('remote_address') if is_ipv6(remote_address): remote_address = f"[{remote_address}]" args = (f"-l [::]:{port.num} " f"-uzr {remote_address}:{remote_port} " f"-f " f"--tcp-timeout 0 " f"--udp-timeout 120") return f"/usr/local/bin/realm {args}"
def get_app_command(self, port: Port): transport_type = port.forward_rule.config.get("transport_type", "raw") remote_port = port.forward_rule.config.get('remote_port') remote_address = port.forward_rule.config.get('remote_address') if is_ipv6(remote_address): remote_address = f"[{remote_address}]" args = ( f"-l :{port.num} " f"--lt {port.forward_rule.config.get('listen_type', 'raw')} " f"-r {'wss://' if transport_type.endswith('wss') else ('ws://' if transport_type != 'raw' else '')}" f"{remote_address}:{remote_port} " f"-ur {'wss://' if transport_type.endswith('wss') else ('ws://' if transport_type != 'raw' else '')}" f"{remote_address}:{remote_port} " f"--tt {transport_type}") return f"/usr/local/bin/ehco {args}"
def get_app_command(self, port: Port): remote_port = port.forward_rule.config.get('remote_port') remote_address = port.forward_rule.config.get('remote_address') if is_ipv6(remote_address): remote_address = f"[{remote_address}]" relay_type = port.forward_rule.config.get('type') args = [] if relay_type in ("ALL", "TCP"): args.append( f"socat TCP6-LISTEN:{port.num},fork,reuseaddr TCP:{remote_address}:{remote_port}" ) if relay_type in ("ALL", "UDP"): args.append( f"socat -T 120 UDP6-LISTEN:{port.num},fork,reuseaddr UDP:{remote_address}:{remote_port}" ) args = " & ".join(args) return f'/bin/sh -c \\"{args}\\"'
def check_ip(ip: str) -> str: if not (is_ip(ip) or is_ipv6(ip)): raise ValueError(f"Invalid ip: {ip}") return ip