Initial commit: xray-manager v0.2 with Debian 13 support

This commit is contained in:
2026-06-28 22:19:53 +03:00
commit 884a55de14
23 changed files with 1890 additions and 0 deletions
+123
View File
@@ -0,0 +1,123 @@
import argparse
import sys
from . import handlers
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(prog="xray-manager")
subparsers = parser.add_subparsers(dest="group", required=True)
# ---------- user ----------
user_parser = subparsers.add_parser("user")
user_subparser = user_parser.add_subparsers(dest="command", required=True)
# user add
user_add_parser = user_subparser.add_parser("add")
user_add_parser.add_argument("username")
user_add_parser.add_argument(
"-c",
"--connection",
nargs="+",
default=[],
help="Connections to add, e.g. shadowsocks:ru1 vless:us1",
)
user_add_parser.set_defaults(handler=handlers.user_add)
# user show
user_show_parser = user_subparser.add_parser("show")
user_show_parser.add_argument("username", nargs="?")
user_show_parser.add_argument("-a", "--all", action="store_true")
user_show_parser.set_defaults(handler=handlers.user_show)
# user modify
user_modify_parser = user_subparser.add_parser("modify")
user_modify_parser.add_argument("username")
user_modify_parser.add_argument(
"-a",
"--add",
dest="to_add",
nargs="+",
default=[],
metavar="SPEC",
help="Connections to add",
)
user_modify_parser.add_argument(
"-d",
"--delete",
dest="to_delete",
nargs="+",
default=[],
metavar="SPEC",
help="Connections to delete",
)
user_modify_parser.set_defaults(handler=handlers.user_modify)
# user delete
user_delete_parser = user_subparser.add_parser("delete")
group = user_delete_parser.add_mutually_exclusive_group(required=True)
group.add_argument("username", nargs="?")
group.add_argument("-a", "--all", action="store_true")
user_delete_parser.set_defaults(handler=handlers.user_delete)
# -------- profile ---------
profile_parser = subparsers.add_parser("profile")
profile_subparser = profile_parser.add_subparsers(
dest="command", required=True
)
# profile build
profile_build_parser = profile_subparser.add_parser("build")
group = profile_build_parser.add_mutually_exclusive_group(required=True)
group.add_argument("username", nargs="?")
group.add_argument("-a", "--all", action="store_true")
profile_build_parser.set_defaults(handler=handlers.profile_build)
# profile show
profile_show_parser = profile_subparser.add_parser("show")
group = profile_show_parser.add_mutually_exclusive_group(required=True)
group.add_argument("username", nargs="?")
group.add_argument("-a", "--all", action="store_true")
profile_show_parser.set_defaults(handler=handlers.profile_show)
# profile clear
profile_clear_parser = profile_subparser.add_parser("clear")
group = profile_clear_parser.add_mutually_exclusive_group(required=True)
group.add_argument("username", nargs="?")
group.add_argument("-a", "--all", action="store_true")
profile_clear_parser.set_defaults(handler=handlers.profile_clear)
# profile delete
profile_delete_parser = profile_subparser.add_parser("delete")
group = profile_delete_parser.add_mutually_exclusive_group(required=True)
group.add_argument("username", nargs="?")
group.add_argument("-a", "--all", action="store_true")
profile_delete_parser.set_defaults(handler=handlers.profile_delete)
# profile qrcode
profile_qrcode_parser = profile_subparser.add_parser("qrcode")
group = profile_qrcode_parser.add_mutually_exclusive_group(required=True)
group.add_argument("username", nargs="?")
group.add_argument("-a", "--all", action="store_true")
profile_qrcode_parser.set_defaults(handler=handlers.profile_qrcode)
return parser
def main():
parser = build_parser()
try:
args = parser.parse_args()
func = args.handler
kwargs = vars(args)
kwargs.pop("handler")
func(**kwargs)
except ValueError as e:
print(e, file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()