diff --git a/vm.py b/vm.py index b4074a0cf5d295bd8bee65944c4ec1f2d8013860..c4e8e9239908ab049d604765e6c553336f67a6f1 100755 --- a/vm.py +++ b/vm.py @@ -7,13 +7,14 @@ import json from dataclasses import dataclass import functools from typing import Optional +import traceback socket_path = '.socket' is_daemon = False if __name__ == "__main__": - if len(sys.argv)==2 and sys.argv[1]=="server": + if len(sys.argv)>=2 and sys.argv[1]=="server": is_daemon = True class S(): @@ -899,6 +900,62 @@ def run(vm: str, prog: str, *arg: tuple[str, ...], gui: bool = False, out_file: ########################################################## +def run_args(args): + if verbose: print(args) + if not args.subcommand: + parser.print_help() + else: + import inspect + f = subcommands[args.subcommand] + spec = get_spec(f) + f_kvarg = {} + f_arg = [] + + def process_arg(name, has_default, default): + if has_default: + if args.__dict__[name] is not None: + f_kvarg[name] = args.__dict__[name] + else: + f_arg.append(args.__dict__[name]) + + for i, arg in enumerate(spec.args): + has_default = spec.defaults is not None and i >= len(spec.args) - len(spec.defaults) + default = None + if has_default: + default = spec.defaults[i - len(spec.args) + len(spec.defaults)] + process_arg(arg, has_default, default) + + for i, arg in enumerate(spec.kwonlyargs): + default = spec.kwonlydefaults[arg] + process_arg(arg, True, default) + + if spec.varargs is not None: + arg = spec.varargs + annotation = spec.annotations.get(arg, None) + if annotation == tuple[str, ...]: + f_arg += args.__dict__[arg] + + if verbose: print(f_arg, f_kvarg) + r = f(*f_arg, **f_kvarg) + if r is not None: + if isinstance(r, tuple) or isinstance(r, list): + for i in r: + print(i) + else: + print(r) + +@cmd +def run_periodically(delay: int, *argv: tuple[str, ...]): + print("RUN PERIODICALLY", argv) + args = parser.parse_args(argv) + while True: + time.sleep(delay) + try: + run_args(args) + except Exception as e: + traceback.print_exception(e) + + def main_daemon(): import socket import struct @@ -911,7 +968,9 @@ def main_daemon(): server.bind(socket_path) os.chmod(socket_path, 0o777) - import traceback + + for arg in sys.argv[2:]: + p = subprocess.Popen([sys.argv[0], *arg.split(" ")]) try: while True: @@ -949,8 +1008,6 @@ def main_daemon(): except Exception as e: traceback.print_exception(e) finally: - # close the connection - # remove the socket file os.unlink(socket_path) exit(1) @@ -963,48 +1020,7 @@ def main(): if args.root_folder is not None: root_folder = args.root_folder+"/" - if verbose: print(args) - if not args.subcommand: - parser.print_help() - else: - import inspect - f = subcommands[args.subcommand] - spec = get_spec(f) - f_kvarg = {} - f_arg = [] - - def process_arg(name, has_default, default): - if has_default: - if args.__dict__[name] is not None: - f_kvarg[name] = args.__dict__[name] - else: - f_arg.append(args.__dict__[name]) - - for i, arg in enumerate(spec.args): - has_default = spec.defaults is not None and i >= len(spec.args) - len(spec.defaults) - default = None - if has_default: - default = spec.defaults[i - len(spec.args) + len(spec.defaults)] - process_arg(arg, has_default, default) - - for i, arg in enumerate(spec.kwonlyargs): - default = spec.kwonlydefaults[arg] - process_arg(arg, True, default) - - if spec.varargs is not None: - arg = spec.varargs - annotation = spec.annotations.get(arg, None) - if annotation == tuple[str, ...]: - f_arg += args.__dict__[arg] - - if verbose: print(f_arg, f_kvarg) - r = f(*f_arg, **f_kvarg) - if r is not None: - if isinstance(r, tuple) or isinstance(r, list): - for i in r: - print(i) - else: - print(r) + run_args(args) diff --git a/vm.service b/vm.service index ce1b9cc557c0ad43cb028607df0d1e1174129103..2a5a2679342bc91be161ade92228854457e90f8b 100644 --- a/vm.service +++ b/vm.service @@ -6,7 +6,8 @@ After=network.target Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin:/home/jiri/bin WorkingDirectory=/mnt/virtual -ExecStart=/mnt/virtual/prog/vm.py server +ExecStart=/mnt/virtual/prog/vm.py server 'run_periodically 10 -- prepare_forks --base base --count 1' 'run_periodically 30 -- clean' + Restart=always RestartSec=10