[signals] update FLAGS handling

This commit is contained in:
Mike Fährmann
2025-07-11 21:01:24 +02:00
parent 2d3b6155eb
commit d8a370da0b
3 changed files with 22 additions and 9 deletions

View File

@@ -91,16 +91,22 @@ def main():
if signals := config.get((), "signals-actions"):
import signal
def signals_handler(event, action):
def handler(signal_num, frame):
signal_name = signal.Signals(signal_num).name
output.stderr_write(f"{signal_name} received\n")
util.FLAGS.__dict__[event] = action
return handler
for signal_name, action in signals.items():
signal_num = getattr(signal, signal_name, None)
if signal_num is None:
log.warning("signal '%s' is not defined", signal_name)
else:
def handler(signal_num, frame):
signal_name = signal.Signals(signal_num).name
output.stderr_write(f"{signal_name} received\n")
util.FLAGS.__dict__[action.upper()] = "stop"
signal.signal(signal_num, handler)
event, _, action = action.rpartition(":")
signal.signal(signal_num, signals_handler(
event.upper() if event else "FILE", action.lower()))
# enable ANSI escape sequences on Windows
if util.WINDOWS and config.get(("output",), "ansi", output.COLORS):

View File

@@ -202,7 +202,7 @@ class Job():
self.update_kwdict(kwdict)
self.handle_url(url, kwdict)
if FLAGS.FILE is not None:
FLAGS.FILE = FLAGS.process(FLAGS.FILE)
FLAGS.process("FILE")
elif msg[0] == Message.Directory:
self.update_kwdict(msg[1])
@@ -216,7 +216,7 @@ class Job():
self.update_kwdict(kwdict)
self.handle_queue(url, kwdict)
if FLAGS.CHILD is not None:
FLAGS.CHILD = FLAGS.process(FLAGS.CHILD)
FLAGS.process("CHILD")
def handle_url(self, url, kwdict):
"""Handle Message.Url"""
@@ -396,7 +396,7 @@ class DownloadJob(Job):
for callback in self.hooks["post-after"]:
callback(self.pathfmt)
if FLAGS.POST is not None:
FLAGS.POST = FLAGS.process(FLAGS.POST)
FLAGS.process("POST")
self.pathfmt.set_directory(kwdict)
if "post" in self.hooks:
for callback in self.hooks["post"]:

View File

@@ -728,8 +728,15 @@ class Flags():
self.FILE = self.POST = self.CHILD = self.DOWNLOAD = None
def process(self, flag):
if flag == "terminate":
value = self.__dict__[flag]
self.__dict__[flag] = None
if value == "abort":
raise exception.AbortExtraction()
if value == "terminate":
raise exception.TerminateExtraction()
if value == "restart":
raise exception.RestartExtraction()
raise exception.StopExtraction()