From e65f127571dc2524aef8d73fc651927b0ecdf8f7 Mon Sep 17 00:00:00 2001 From: ed Date: Wed, 28 Jul 2021 01:18:38 +0200 Subject: [PATCH] list server ips on windows --- copyparty/tcpsrv.py | 62 +++++++++++++++++++++++++++++++++++++++------ copyparty/th_srv.py | 2 +- copyparty/util.py | 6 ++--- tests/util.py | 10 ++++---- 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/copyparty/tcpsrv.py b/copyparty/tcpsrv.py index 9dbfbbbc..75ab5b38 100644 --- a/copyparty/tcpsrv.py +++ b/copyparty/tcpsrv.py @@ -4,7 +4,7 @@ from __future__ import print_function, unicode_literals import re import socket -from .__init__ import MACOS +from .__init__ import MACOS, ANYWIN from .util import chkcmd @@ -85,7 +85,7 @@ class TcpSrv(object): def ips_linux(self): eps = {} try: - txt, _ = chkcmd("ip", "addr") + txt, _ = chkcmd(["ip", "addr"]) except: return eps @@ -93,9 +93,7 @@ class TcpSrv(object): for ln in txt.split("\n"): try: ip, dev = r.match(ln.rstrip()).groups() - for lip in listen_ips: - if lip in ["0.0.0.0", ip]: - eps[ip] = dev + eps[ip] = dev except: pass @@ -104,7 +102,7 @@ class TcpSrv(object): def ips_macos(self): eps = {} try: - txt, _ = chkcmd("ifconfig") + txt, _ = chkcmd(["ifconfig"]) except: return eps @@ -115,21 +113,69 @@ class TcpSrv(object): m = rdev.match(ln) if m: dev = m.group(1) - + m = rip.match(ln) if m: eps[m.group(1)] = dev return eps - def detect_interfaces(self, listen_ips): + def ips_windows_ipconfig(self): eps = {} + try: + txt, _ = chkcmd(["ipconfig"]) + except: + return eps + rdev = re.compile(r"(^[^ ].*):$") + rip = re.compile(r"^ +IPv?4? [^:]+: *([0-9\.]{7,15})$") + dev = None + for ln in txt.replace("\r", "").split("\n"): + m = rdev.match(ln) + if m: + dev = m.group(1).split(" adapter ", 1)[-1] + + m = rip.match(ln) + if m and dev: + eps[m.group(1)] = dev + dev = None + + return eps + + def ips_windows_netsh(self): + eps = {} + try: + txt, _ = chkcmd("netsh interface ip show address".split()) + except: + return eps + + rdev = re.compile(r'.* "([^"]+)"$') + rip = re.compile(r".* IP\b.*: +([0-9\.]{7,15})$") + dev = None + for ln in txt.replace("\r", "").split("\n"): + m = rdev.match(ln) + if m: + dev = m.group(1) + + m = rip.match(ln) + if m and dev: + eps[m.group(1)] = dev + dev = None + + return eps + + def detect_interfaces(self, listen_ips): if MACOS: eps = self.ips_macos() + elif ANYWIN: + eps = self.ips_windows_ipconfig() # sees more interfaces + eps.update(self.ips_windows_netsh()) # has better names else: eps = self.ips_linux() + if "0.0.0.0" not in listen_ips: + eps = {k: v for k, v in eps if k in listen_ips} + default_route = None s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) for ip in [ diff --git a/copyparty/th_srv.py b/copyparty/th_srv.py index 166e088b..200a4825 100644 --- a/copyparty/th_srv.py +++ b/copyparty/th_srv.py @@ -306,7 +306,7 @@ class ThumbSrv(object): cmd += [fsenc(tpath)] - ret, sout, serr = runcmd(*cmd) + ret, sout, serr = runcmd(cmd) if ret != 0: msg = ["ff: {}".format(x) for x in serr.split("\n")] self.log("FFmpeg failed:\n" + "\n".join(msg), c="1;30") diff --git a/copyparty/util.py b/copyparty/util.py index bac3cf53..8d963ccd 100644 --- a/copyparty/util.py +++ b/copyparty/util.py @@ -1125,7 +1125,7 @@ def guess_mime(url, fallback="application/octet-stream"): return ret -def runcmd(*argv): +def runcmd(argv): p = sp.Popen(argv, stdout=sp.PIPE, stderr=sp.PIPE) stdout, stderr = p.communicate() stdout = stdout.decode("utf-8", "replace") @@ -1133,8 +1133,8 @@ def runcmd(*argv): return [p.returncode, stdout, stderr] -def chkcmd(*argv): - ok, sout, serr = runcmd(*argv) +def chkcmd(argv): + ok, sout, serr = runcmd(argv) if ok != 0: raise Exception(serr) diff --git a/tests/util.py b/tests/util.py index 666fdbca..03152f3a 100644 --- a/tests/util.py +++ b/tests/util.py @@ -31,7 +31,7 @@ if MACOS: from copyparty.util import Unrecv -def runcmd(*argv): +def runcmd(argv): p = sp.Popen(argv, stdout=sp.PIPE, stderr=sp.PIPE) stdout, stderr = p.communicate() stdout = stdout.decode("utf-8") @@ -39,8 +39,8 @@ def runcmd(*argv): return [p.returncode, stdout, stderr] -def chkcmd(*argv): - ok, sout, serr = runcmd(*argv) +def chkcmd(argv): + ok, sout, serr = runcmd(argv) if ok != 0: raise Exception(serr) @@ -60,12 +60,12 @@ def get_ramdisk(): if os.path.exists("/Volumes"): # hdiutil eject /Volumes/cptd/ - devname, _ = chkcmd("hdiutil", "attach", "-nomount", "ram://131072") + devname, _ = chkcmd("hdiutil attach -nomount ram://131072".split()) devname = devname.strip() print("devname: [{}]".format(devname)) for _ in range(10): try: - _, _ = chkcmd("diskutil", "eraseVolume", "HFS+", "cptd", devname) + _, _ = chkcmd(["diskutil", "eraseVolume", "HFS+", "cptd", devname]) with open("/Volumes/cptd/.metadata_never_index", "w") as f: f.write("orz")