cli.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from __future__ import annotations
  2. import argparse
  3. import asyncio
  4. import json
  5. from . import __version__
  6. from .config import Config
  7. from .relay_server import RelayServer
  8. from .relay_client import RelayManager
  9. from .transparent_edge import TransparentEdge
  10. def build_parser() -> argparse.ArgumentParser:
  11. parser = argparse.ArgumentParser(prog="mynetspeeder")
  12. parser.add_argument("--version", action="version", version=f"%(prog)s {__version__}")
  13. sub = parser.add_subparsers(dest="command", required=True)
  14. relay = sub.add_parser("relay", help="在子节点 VPS 上启动 relay")
  15. relay.add_argument("--listen-host", default="0.0.0.0")
  16. relay.add_argument("--listen-port", type=int, default=9009)
  17. relay.add_argument("--token", required=True)
  18. relay.set_defaults(handler=handle_relay)
  19. edge = sub.add_parser("edge", help="在当前主 VPS 上启动透明 direct 出站加速")
  20. edge.add_argument("--listen-host", default="127.0.0.1")
  21. edge.add_argument("--listen-port", type=int, default=19080)
  22. edge.add_argument("--config", required=True)
  23. edge.set_defaults(handler=handle_edge)
  24. probe = sub.add_parser("probe", help="查看子节点探测与在线状态")
  25. probe.add_argument("--config", required=True)
  26. probe.add_argument("--once", action="store_true")
  27. probe.set_defaults(handler=handle_probe)
  28. return parser
  29. def handle_relay(args: argparse.Namespace) -> int:
  30. asyncio.run(RelayServer(args.token).start(args.listen_host, args.listen_port))
  31. return 0
  32. def handle_edge(args: argparse.Namespace) -> int:
  33. asyncio.run(TransparentEdge(args.listen_host, args.listen_port, Config.load(args.config)).start())
  34. return 0
  35. def handle_probe(args: argparse.Namespace) -> int:
  36. async def run_probe() -> None:
  37. manager = RelayManager(Config.load(args.config))
  38. await manager.start()
  39. await asyncio.sleep(2)
  40. print(json.dumps(manager.snapshot(), ensure_ascii=False, indent=2))
  41. if not args.once:
  42. while True:
  43. await asyncio.sleep(5)
  44. print(json.dumps(manager.snapshot(), ensure_ascii=False, indent=2))
  45. asyncio.run(run_probe())
  46. return 0
  47. def main() -> int:
  48. parser = build_parser()
  49. args = parser.parse_args()
  50. return args.handler(args)