A Python port of the Invisible Internet Project (I2P)
1"""CLI entry point for the SAM bridge: i2p-sam command."""
2
3from __future__ import annotations
4
5import argparse
6import asyncio
7import logging
8import signal
9import sys
10
11from i2p_sam.bridge import SAMBridge
12
13
14def main() -> None:
15 parser = argparse.ArgumentParser(
16 prog="i2p-sam",
17 description="I2P SAM bridge — language-agnostic socket API for I2P",
18 )
19 parser.add_argument(
20 "--host", default="127.0.0.1",
21 help="Listen host (default: 127.0.0.1)",
22 )
23 parser.add_argument(
24 "--port", type=int, default=7656,
25 help="Listen port (default: 7656)",
26 )
27 parser.add_argument(
28 "--log-level", default="INFO",
29 choices=["DEBUG", "INFO", "WARNING", "ERROR"],
30 help="Log level (default: INFO)",
31 )
32 args = parser.parse_args()
33
34 logging.basicConfig(
35 level=getattr(logging, args.log_level),
36 format="%(asctime)s %(levelname)-8s %(name)s: %(message)s",
37 stream=sys.stdout,
38 )
39 log = logging.getLogger(__name__)
40
41 bridge = SAMBridge(host=args.host, port=args.port)
42
43 async def run() -> None:
44 await bridge.start()
45 log.info("SAM bridge running on %s:%d", args.host, bridge.port)
46
47 stop = asyncio.Event()
48 loop = asyncio.get_event_loop()
49 for sig in (signal.SIGTERM, signal.SIGINT):
50 loop.add_signal_handler(sig, stop.set)
51 await stop.wait()
52
53 log.info("Signal received, shutting down...")
54 await bridge.stop()
55
56 asyncio.run(run())
57
58
59if __name__ == "__main__":
60 main()