hook-flag to send input on stdin

This commit is contained in:
ed 2025-10-05 20:35:03 +00:00
parent 50276c0cfa
commit 4542ad3c01
2 changed files with 18 additions and 6 deletions

View file

@ -813,6 +813,7 @@ def get_sects():
\033[36mf\033[35m forks the process, doesn't wait for completion \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[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[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[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[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) \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 the \033[33m--\033[35m stops notify-send from reading the message as args
and the alert will be "hey" followed by the messagetext 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 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,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 \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) 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 \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 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; \033[36mxban\033[0m can be used to overrule / cancel a user ban event;

View file

@ -3629,12 +3629,13 @@ def retchk(
def _parsehook( def _parsehook(
log: Optional["NamedLogger"], cmd: str 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 = "" areq = ""
chk = False chk = False
fork = False fork = False
jtxt = False jtxt = False
imp = False imp = False
sin = False
wait = 0.0 wait = 0.0
tout = 0.0 tout = 0.0
kill = "t" kill = "t"
@ -3650,6 +3651,8 @@ def _parsehook(
jtxt = True jtxt = True
elif arg == "I": elif arg == "I":
imp = True imp = True
elif arg == "s":
sin = True
elif arg.startswith("w"): elif arg.startswith("w"):
wait = float(arg[1:]) wait = float(arg[1:])
elif arg.startswith("t"): elif arg.startswith("t"):
@ -3694,7 +3697,7 @@ def _parsehook(
argv[0] = os.path.expandvars(os.path.expanduser(argv[0])) 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( def runihook(
@ -3704,7 +3707,7 @@ def runihook(
vol: "VFS", vol: "VFS",
ups: list[tuple[str, int, int, str, str, str, int, str]], ups: list[tuple[str, int, int, str, str, str, int, str]],
) -> bool: ) -> 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] bcmd = [sfsenc(x) for x in acmd]
if acmd[0].endswith(".py"): if acmd[0].endswith(".py"):
bcmd = [sfsenc(pybin)] + bcmd bcmd = [sfsenc(pybin)] + bcmd
@ -3883,7 +3886,7 @@ def _runhook(
txt: str, txt: str,
) -> dict[str, Any]: ) -> dict[str, Any]:
ret = {"rc": 0} 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: if areq:
for ch in areq: for ch in areq:
if ch not in perms: if ch not in perms:
@ -3919,7 +3922,11 @@ def _runhook(
raise Exception("zmq says %d" % (zi,)) raise Exception("zmq says %d" % (zi,))
return {"rc": 0, "stdout": zs} 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"): if acmd[0].endswith(".py"):
acmd = [pybin] + acmd acmd = [pybin] + acmd