From 4542ad3c01d53acf5dff2f086eec0daa9f9fa493 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 5 Oct 2025 20:35:03 +0000 Subject: [PATCH] hook-flag to send input on stdin --- copyparty/__main__.py | 7 ++++++- copyparty/util.py | 17 ++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/copyparty/__main__.py b/copyparty/__main__.py index e88cdf8f..0da5fa1e 100644 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -813,6 +813,7 @@ def get_sects(): \033[36mf\033[35m forks the process, doesn't wait for completion \033[36mc\033[35m checks return code, blocks the action if non-zero \033[36mj\033[35m provides json with info as 1st arg instead of filepath + \033[36ms\033[35m provides input data on stdin (instead of 1st arg) \033[36mwN\033[35m waits N sec after command has been started before continuing \033[36mtN\033[35m sets an N sec timeout before the command is abandoned \033[36miN\033[35m xiu only: volume must be idle for N sec (default = 5) @@ -846,6 +847,9 @@ def get_sects(): the \033[33m--\033[35m stops notify-send from reading the message as args and the alert will be "hey" followed by the messagetext + \033[36m--xm s,,tee,-a,log.txt\033[35m appends each msg to log.txt; + \033[36m--xm s,j,,tee,-a,log.txt\033[35m writes it as json instead + \033[36m--xau zmq:pub:tcp://*:5556\033[35m announces uploads on zeromq; \033[36m--xau t3,zmq:push:tcp://*:5557\033[35m also works, and you can \033[36m--xau t3,j,zmq:req:tcp://localhost:5555\033[35m too for example @@ -855,7 +859,8 @@ def get_sects(): as soon as the volume has been idle for iN seconds (5 by default) \033[36mxiu\033[0m is also unique in that it will pass the metadata to the - executed program on STDIN instead of as argv arguments, and + executed program on STDIN instead of as argv arguments (so + just like the \033[36ms\033[0m option does for the other hook types), and it also includes the wark (file-id/hash) as a json property \033[36mxban\033[0m can be used to overrule / cancel a user ban event; diff --git a/copyparty/util.py b/copyparty/util.py index 8ce3bdc0..d8011ddf 100644 --- a/copyparty/util.py +++ b/copyparty/util.py @@ -3629,12 +3629,13 @@ def retchk( def _parsehook( log: Optional["NamedLogger"], cmd: str -) -> tuple[str, bool, bool, bool, bool, float, dict[str, Any], list[str]]: +) -> tuple[str, bool, bool, bool, bool, bool, float, dict[str, Any], list[str]]: areq = "" chk = False fork = False jtxt = False imp = False + sin = False wait = 0.0 tout = 0.0 kill = "t" @@ -3650,6 +3651,8 @@ def _parsehook( jtxt = True elif arg == "I": imp = True + elif arg == "s": + sin = True elif arg.startswith("w"): wait = float(arg[1:]) elif arg.startswith("t"): @@ -3694,7 +3697,7 @@ def _parsehook( argv[0] = os.path.expandvars(os.path.expanduser(argv[0])) - return areq, chk, imp, fork, jtxt, wait, sp_ka, argv + return areq, chk, imp, fork, sin, jtxt, wait, sp_ka, argv def runihook( @@ -3704,7 +3707,7 @@ def runihook( vol: "VFS", ups: list[tuple[str, int, int, str, str, str, int, str]], ) -> bool: - _, chk, imp, fork, jtxt, wait, sp_ka, acmd = _parsehook(log, cmd) + _, chk, _, fork, _, jtxt, wait, sp_ka, acmd = _parsehook(log, cmd) bcmd = [sfsenc(x) for x in acmd] if acmd[0].endswith(".py"): bcmd = [sfsenc(pybin)] + bcmd @@ -3883,7 +3886,7 @@ def _runhook( txt: str, ) -> dict[str, Any]: ret = {"rc": 0} - areq, chk, imp, fork, jtxt, wait, sp_ka, acmd = _parsehook(log, cmd) + areq, chk, imp, fork, sin, jtxt, wait, sp_ka, acmd = _parsehook(log, cmd) if areq: for ch in areq: if ch not in perms: @@ -3919,7 +3922,11 @@ def _runhook( raise Exception("zmq says %d" % (zi,)) return {"rc": 0, "stdout": zs} - acmd += [arg] + if sin: + sp_ka["sin"] = (arg + "\n").encode("utf-8", "replace") + else: + acmd += [arg] + if acmd[0].endswith(".py"): acmd = [pybin] + acmd