A Python port of the Invisible Internet Project (I2P)
at main 60 lines 1.6 kB view raw
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()