diff --git a/copyparty/__main__.py b/copyparty/__main__.py index ed7512b4..dd5da8a0 100644 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -418,6 +418,7 @@ def run_argparse(argv, formatter): ap2.add_argument("-emp", action="store_true", help="enable markdown plugins") ap2.add_argument("-mcr", metavar="SEC", type=int, default=60, help="md-editor mod-chk rate") ap2.add_argument("--urlform", metavar="MODE", type=u, default="print,get", help="how to handle url-forms; examples: [stash], [save,get]") + ap2.add_argument("--wintitle", metavar="TXT", type=u, default="cpp @ $pub", help="window title, for example '$ip-10.1.2.' or '$ip-'") ap2 = ap.add_argument_group('upload options') ap2.add_argument("--dotpart", action="store_true", help="dotfile incomplete uploads") @@ -608,6 +609,9 @@ def main(argv=None): except: print("\nfailed to disable quick-edit-mode:\n" + min_ex() + "\n") + if not VT100: + al.wintitle = "" + nstrs = [] anymod = False for ostr in al.v or []: diff --git a/copyparty/svchub.py b/copyparty/svchub.py index 5258576b..764adeac 100644 --- a/copyparty/svchub.py +++ b/copyparty/svchub.py @@ -302,6 +302,10 @@ class SvcHub(object): print("nailed it", end="") ret = self.retcode finally: + if self.args.wintitle: + print("\033]0;\033\\", file=sys.stderr, end="") + sys.stderr.flush() + print("\033[0m") if self.logf: self.logf.close() diff --git a/copyparty/tcpsrv.py b/copyparty/tcpsrv.py index 1cc1513f..229112f7 100644 --- a/copyparty/tcpsrv.py +++ b/copyparty/tcpsrv.py @@ -2,9 +2,10 @@ from __future__ import print_function, unicode_literals import re +import sys import socket -from .__init__ import MACOS, ANYWIN +from .__init__ import MACOS, ANYWIN, unicode from .util import chkcmd @@ -54,6 +55,8 @@ class TcpSrv(object): eps[x] = "external" msgs = [] + title_tab = {} + title_vars = [x[1:] for x in self.args.wintitle.split(" ") if x.startswith("$")] m = "available @ http://{}:{}/ (\033[33m{}\033[0m)" for ip, desc in sorted(eps.items(), key=lambda x: x[1]): for port in sorted(self.args.p): @@ -62,11 +65,36 @@ class TcpSrv(object): msgs.append(m.format(ip, port, desc)) + if not self.args.wintitle: + continue + + if port in [80, 443]: + ep = ip + else: + ep = "{}:{}".format(ip, port) + + hits = [] + if "pub" in title_vars and "external" in unicode(desc): + hits.append(("pub", ep)) + + for var in title_vars: + if var.startswith("ip-") and ep.startswith(var[3:]): + hits.append((var, ep)) + + for tk, tv in hits: + try: + title_tab[tk] += " and {}".format(tv) + except: + title_tab[tk] = tv + if msgs: msgs[-1] += "\n" for m in msgs: self.log("tcpsrv", m) + if self.args.wintitle: + self._set_wintitle(title_tab) + def _listen(self, ip, port): srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) @@ -232,3 +260,17 @@ class TcpSrv(object): eps[default_route] = desc return eps + + def _set_wintitle(self, vars): + if "pub" not in vars: + vars["pub"] = "Local-Only" + + title = "" + for p in self.args.wintitle.split(" "): + if p.startswith("$"): + p = vars.get(p[1:], "(None)") + + title += "{} ".format(p) + + print("\033]0;{}\033\\".format(title), file=sys.stderr, end="") + sys.stderr.flush()