From beabc10b0d740d19a4d1e261b1283a16a28bd36f Mon Sep 17 00:00:00 2001 From: terminaldweller Date: Tue, 17 Jan 2023 14:47:50 +0330 Subject: mostly working now --- bin/tunneltop | 83 +++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 47 insertions(+), 36 deletions(-) diff --git a/bin/tunneltop b/bin/tunneltop index 1c65d0d..b3a3962 100755 --- a/bin/tunneltop +++ b/bin/tunneltop @@ -5,6 +5,7 @@ import argparse import asyncio import copy import enum +import os import signal import sys import typing @@ -21,21 +22,22 @@ class Argparser: # pylint: disable=too-few-public-methods "--config", "-c", type=str, - help="the path to the .tunneltop.toml file", - default="/home/devi/.tunneltop.toml", + help="The path to the .tunneltop.toml file," + " defaults to $HOME/.tunneltop.toml", + default="~/.tunneltop.toml", ) self.parser.add_argument( "--noheader", "-n", type=bool, - help="dont print the header", + help="Dont print the header in the output", default=False, ) self.parser.add_argument( "--delay", "-d", type=float, - help="The delay between updates in seconds", + help="The delay between redraws in seconds, defaults to 5 seconds", default=5, ) self.args = self.parser.parse_args() @@ -201,28 +203,8 @@ class TunnelTop: return tasks - # pylint: disable=unused-argument - async def sighup_handler(self, signum, frame): - """SIGHUP handler. we want to reload the config.""" - # type: ignore # pylint: disable=E0203 - data_cols_new: typing.Dict[str, typing.Dict[str, str]] = {} - with open(self.argparser.args.config, "rb") as conf_file: - data = tomllib.load(conf_file) - for key, value in data.items(): - data_cols_new[key] = { - "name": key, - "address": value["address"], - "port": value["port"], - "command": value["command"], - "status": "UNKN", - "test_command": value["test_command"], - "test_command_result": value["test_command_result"], - "test_interval": value["test_interval"], - "test_timeout": value["test_timeout"], - "stdout": "", - "stderr": "", - } - + async def sighup_handler_async_worker(self, data_cols_new): + """Handles the actual updating of tasks when we get SIGTERM""" for k, value in data_cols_new.items(): if k not in self.data_cols: self.tunnel_tasks.append( @@ -241,13 +223,13 @@ class TunnelTop: for task in self.tunnel_tasks: if task.get_name() == k: task.cancel() - self.data_cols[k] = copy.deepcopy(data_cols_new[k]) - self.tunnel_tasks.append( - asyncio.create_task( - self.run_subshell(value["command"]), name=k - ) + self.data_cols[k] = copy.deepcopy(data_cols_new[k]) + self.tunnel_tasks.append( + asyncio.create_task( + self.run_subshell(value["command"]), name=k ) - await asyncio.sleep(0) + ) + await asyncio.sleep(0) for k, _ in self.data_cols.items(): if k not in data_cols_new: @@ -256,13 +238,37 @@ class TunnelTop: task.cancel() del self.data_cols[k] + async def sighup_handler(self): + """SIGHUP handler. we want to reload the config.""" + # type: ignore # pylint: disable=E0203 + data_cols_new: typing.Dict[str, typing.Dict[str, str]] = {} + with open(self.argparser.args.config, "rb") as conf_file: + data = tomllib.load(conf_file) + for key, value in data.items(): + data_cols_new[key] = { + "name": key, + "address": value["address"], + "port": value["port"], + "command": value["command"], + "status": "UNKN", + "test_command": value["test_command"], + "test_command_result": value["test_command_result"], + "test_interval": value["test_interval"], + "test_timeout": value["test_timeout"], + "stdout": "", + "stderr": "", + } + await self.sighup_handler_async_worker(data_cols_new) + async def main(self) -> None: """entrypoint""" - signal.signal(signal.SIGHUP, self.sighup_handler) + # signal.signal(signal.SIGHUP, self.sighup_handler) print(Colors.screen_clear, end="") print(Colors.hide_cursor, end="") - with open(self.argparser.args.config, "rb") as conf_file: + with open( + os.path.expanduser(self.argparser.args.config), "rb" + ) as conf_file: data = tomllib.load(conf_file) for key, value in data.items(): self.data_cols[key] = { @@ -279,6 +285,11 @@ class TunnelTop: "stderr": "", } + loop = asyncio.get_event_loop() + loop.add_signal_handler( + signal.SIGHUP, + lambda: asyncio.create_task(self.sighup_handler()), + ) self.tunnel_tasks = await self.tunnel_procs() while True: @@ -300,8 +311,8 @@ class TunnelTop: print(line) await asyncio.sleep(self.argparser.args.delay) - # print(Colors.screen_clear, end="") - # print(Colors.hide_cursor, end="") + print(Colors.screen_clear, end="") + print(Colors.hide_cursor, end="") if __name__ == "__main__": -- cgit v1.2.3