From: Thomas Walker Lynch Date: Mon, 3 Nov 2025 05:53:58 +0000 (+0000) Subject: . X-Git-Url: https://git.reasoningtechnology.com/style/static/git-logo.png?a=commitdiff_plain;h=e11e92258df549b6323e2be5bd3c00572c7e39d1;p=subu . --- diff --git a/developer/source/manager/CLI b/developer/source/manager/CLI deleted file mode 100755 index a79691e..0000000 --- a/developer/source/manager/CLI +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/env python3 -# -*- mode: python; coding: utf-8; python-indent-offset: 2; indent-tabs-mode: nil -*- -""" -CLI.py — thin command-line harness -Version: 0.2.0 -""" -import sys, argparse -from text import USAGE, HELP, EXAMPLE, VERSION -import core - -def CLI(argv=None) -> int: - argv = argv or sys.argv[1:] - if not argv: - print(USAGE) - return 0 - - # simple verbs that bypass argparse (so `help/version/example` always work) - simple = {"help": HELP, "--help": HELP, "-h": HELP, "usage": USAGE, "example": EXAMPLE, "version": VERSION} - if argv[0] in simple: - out = simple[argv[0]] - print(out if isinstance(out, str) else out()) - return 0 - - p = argparse.ArgumentParser(prog="subu", add_help=False) - p.add_argument("-V", "--Version", action="store_true", help="print version") - sub = p.add_subparsers(dest="verb") - - # init - ap = sub.add_parser("init") - ap.add_argument("token", nargs="?") - - # create/list/info - ap = sub.add_parser("create") - ap.add_argument("owner") - ap.add_argument("name") - - sub.add_parser("list") - ap = sub.add_parser("info"); ap.add_argument("subu_id") - ap = sub.add_parser("information"); ap.add_argument("subu_id") - - # lo - ap = sub.add_parser("lo") - ap.add_argument("state", choices=["up","down"]) - ap.add_argument("subu_id") - - # WG - ap = sub.add_parser("WG") - ap.add_argument("verb", choices=["global","create","server_provided_public_key","info","information","up","down"]) - ap.add_argument("arg1", nargs="?") - ap.add_argument("arg2", nargs="?") - - # attach/detach - ap = sub.add_parser("attach") - ap.add_argument("what", choices=["WG"]) - ap.add_argument("subu_id") - ap.add_argument("wg_id") - - ap = sub.add_parser("detach") - ap.add_argument("what", choices=["WG"]) - ap.add_argument("subu_id") - - # network - ap = sub.add_parser("network") - ap.add_argument("state", choices=["up","down"]) - ap.add_argument("subu_id") - - # option - ap = sub.add_parser("option") - ap.add_argument("verb", choices=["set","get","list"]) - ap.add_argument("subu_id") - ap.add_argument("name", nargs="?") - ap.add_argument("value", nargs="?") - - # exec - ap = sub.add_parser("exec") - ap.add_argument("subu_id") - ap.add_argument("--", dest="cmd", nargs=argparse.REMAINDER, default=[]) - - ns = p.parse_args(argv) - if ns.Version: - print(VERSION); return 0 - - try: - if ns.verb == "init": - return core.cmd_init(ns.token) - - if ns.verb == "create": - core.create_subu(ns.owner, ns.name); return 0 - if ns.verb == "list": - core.list_subu(); return 0 - if ns.verb in ("info","information"): - core.info_subu(ns.subu_id); return 0 - - if ns.verb == "lo": - core.lo_toggle(ns.subu_id, ns.state); return 0 - - if ns.verb == "WG": - v = ns.verb - if ns.arg1 is None and v in ("info","information"): - print("WG info requires WG_ID"); return 2 - if v == "global": - core.wg_global(ns.arg1); return 0 - if v == "create": - wid = core.wg_create(ns.arg1); print(wid); return 0 - if v == "server_provided_public_key": - core.wg_set_pubkey(ns.arg1, ns.arg2); return 0 - if v in ("info","information"): - core.wg_info(ns.arg1); return 0 - if v == "up": - core.wg_up(ns.arg1); return 0 - if v == "down": - core.wg_down(ns.arg1); return 0 - - if ns.verb == "attach": - if ns.what == "WG": - core.attach_wg(ns.subu_id, ns.wg_id); return 0 - - if ns.verb == "detach": - if ns.what == "WG": - core.detach_wg(ns.subu_id); return 0 - - if ns.verb == "network": - core.network_toggle(ns.subu_id, ns.state); return 0 - - if ns.verb == "option": - if ns.verb == "option" and ns.name is None and ns.value is None and ns.verb == "list": - core.option_list(ns.subu_id); return 0 - if ns.verb == "set": - core.option_set(ns.subu_id, ns.name, ns.value); return 0 - if ns.verb == "get": - core.option_get(ns.subu_id, ns.name); return 0 - if ns.verb == "list": - core.option_list(ns.subu_id); return 0 - - if ns.verb == "exec": - if not ns.cmd: - print("subu exec -- ..."); return 2 - core.exec_in_subu(ns.subu_id, ns.cmd); return 0 - - print(USAGE); return 2 - except Exception as e: - print(f"error: {e}") - return 1 - -if __name__ == "__main__": - sys.exit(CLI()) diff --git a/developer/source/manager/CLI.py b/developer/source/manager/CLI.py new file mode 100755 index 0000000..a79691e --- /dev/null +++ b/developer/source/manager/CLI.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python3 +# -*- mode: python; coding: utf-8; python-indent-offset: 2; indent-tabs-mode: nil -*- +""" +CLI.py — thin command-line harness +Version: 0.2.0 +""" +import sys, argparse +from text import USAGE, HELP, EXAMPLE, VERSION +import core + +def CLI(argv=None) -> int: + argv = argv or sys.argv[1:] + if not argv: + print(USAGE) + return 0 + + # simple verbs that bypass argparse (so `help/version/example` always work) + simple = {"help": HELP, "--help": HELP, "-h": HELP, "usage": USAGE, "example": EXAMPLE, "version": VERSION} + if argv[0] in simple: + out = simple[argv[0]] + print(out if isinstance(out, str) else out()) + return 0 + + p = argparse.ArgumentParser(prog="subu", add_help=False) + p.add_argument("-V", "--Version", action="store_true", help="print version") + sub = p.add_subparsers(dest="verb") + + # init + ap = sub.add_parser("init") + ap.add_argument("token", nargs="?") + + # create/list/info + ap = sub.add_parser("create") + ap.add_argument("owner") + ap.add_argument("name") + + sub.add_parser("list") + ap = sub.add_parser("info"); ap.add_argument("subu_id") + ap = sub.add_parser("information"); ap.add_argument("subu_id") + + # lo + ap = sub.add_parser("lo") + ap.add_argument("state", choices=["up","down"]) + ap.add_argument("subu_id") + + # WG + ap = sub.add_parser("WG") + ap.add_argument("verb", choices=["global","create","server_provided_public_key","info","information","up","down"]) + ap.add_argument("arg1", nargs="?") + ap.add_argument("arg2", nargs="?") + + # attach/detach + ap = sub.add_parser("attach") + ap.add_argument("what", choices=["WG"]) + ap.add_argument("subu_id") + ap.add_argument("wg_id") + + ap = sub.add_parser("detach") + ap.add_argument("what", choices=["WG"]) + ap.add_argument("subu_id") + + # network + ap = sub.add_parser("network") + ap.add_argument("state", choices=["up","down"]) + ap.add_argument("subu_id") + + # option + ap = sub.add_parser("option") + ap.add_argument("verb", choices=["set","get","list"]) + ap.add_argument("subu_id") + ap.add_argument("name", nargs="?") + ap.add_argument("value", nargs="?") + + # exec + ap = sub.add_parser("exec") + ap.add_argument("subu_id") + ap.add_argument("--", dest="cmd", nargs=argparse.REMAINDER, default=[]) + + ns = p.parse_args(argv) + if ns.Version: + print(VERSION); return 0 + + try: + if ns.verb == "init": + return core.cmd_init(ns.token) + + if ns.verb == "create": + core.create_subu(ns.owner, ns.name); return 0 + if ns.verb == "list": + core.list_subu(); return 0 + if ns.verb in ("info","information"): + core.info_subu(ns.subu_id); return 0 + + if ns.verb == "lo": + core.lo_toggle(ns.subu_id, ns.state); return 0 + + if ns.verb == "WG": + v = ns.verb + if ns.arg1 is None and v in ("info","information"): + print("WG info requires WG_ID"); return 2 + if v == "global": + core.wg_global(ns.arg1); return 0 + if v == "create": + wid = core.wg_create(ns.arg1); print(wid); return 0 + if v == "server_provided_public_key": + core.wg_set_pubkey(ns.arg1, ns.arg2); return 0 + if v in ("info","information"): + core.wg_info(ns.arg1); return 0 + if v == "up": + core.wg_up(ns.arg1); return 0 + if v == "down": + core.wg_down(ns.arg1); return 0 + + if ns.verb == "attach": + if ns.what == "WG": + core.attach_wg(ns.subu_id, ns.wg_id); return 0 + + if ns.verb == "detach": + if ns.what == "WG": + core.detach_wg(ns.subu_id); return 0 + + if ns.verb == "network": + core.network_toggle(ns.subu_id, ns.state); return 0 + + if ns.verb == "option": + if ns.verb == "option" and ns.name is None and ns.value is None and ns.verb == "list": + core.option_list(ns.subu_id); return 0 + if ns.verb == "set": + core.option_set(ns.subu_id, ns.name, ns.value); return 0 + if ns.verb == "get": + core.option_get(ns.subu_id, ns.name); return 0 + if ns.verb == "list": + core.option_list(ns.subu_id); return 0 + + if ns.verb == "exec": + if not ns.cmd: + print("subu exec -- ..."); return 2 + core.exec_in_subu(ns.subu_id, ns.cmd); return 0 + + print(USAGE); return 2 + except Exception as e: + print(f"error: {e}") + return 1 + +if __name__ == "__main__": + sys.exit(CLI()) diff --git a/developer/source/manager/subu b/developer/source/manager/subu new file mode 120000 index 0000000..45a8ec1 --- /dev/null +++ b/developer/source/manager/subu @@ -0,0 +1 @@ +CLI.py \ No newline at end of file