Advertisement
Guest User

forward-port.py

a guest
Nov 28th, 2014
409
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.97 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. """Forward a local tcp port to host:port.
  3.  
  4. Usage: %(prog)s local_port:host:port
  5.  
  6. Example:
  7.  
  8.  $ python3 forward-port.py 26992:icanhazip.com:80 # start server
  9.  
  10. and in another window:
  11.  
  12.  $ curl localhost:26992 # connect to it
  13. """
  14. import asyncio
  15. import logging
  16. import sys
  17.  
  18. info = logging.getLogger('forward-port').info
  19.  
  20. @asyncio.coroutine
  21. def copy_stream(reader, writer, bufsize=1<<16):
  22.     while True:
  23.         data = yield from reader.read(bufsize)
  24.         if not data:
  25.             break
  26.         writer.write(data)
  27.         yield from writer.drain()
  28.     writer.close()
  29.  
  30. def port_forwarder(host, port, *, loop):
  31.     @asyncio.coroutine
  32.     def forward(local_reader, local_writer):
  33.         client = local_writer.get_extra_info('peername')
  34.         info('connected client %s %s', *client)
  35.         remote_reader, remote_writer = yield from asyncio.open_connection(host, port, loop=loop)
  36.         yield from asyncio.wait([copy_stream(local_reader, remote_writer),
  37.                                  copy_stream(remote_reader, local_writer)],
  38.                                 loop=loop)
  39.         info('disconnected client %s %s', *client)
  40.  
  41.     return forward
  42.  
  43. # main
  44. logging.basicConfig(level=logging.INFO,
  45.                     format="%(asctime)-15s %(message)s", datefmt="%F %T")
  46. if len(sys.argv) != 2:
  47.     sys.exit(__doc__)
  48. local_port, host, port = sys.argv[1].split(':') # e.g., 12345:localhost:22
  49.  
  50. loop = asyncio.get_event_loop()
  51. server = loop.run_until_complete(asyncio.start_server(port_forwarder(host, int(port), loop=loop),
  52.                                                       'localhost', int(local_port), loop=loop))
  53. info('listening on: %s %s', *server.sockets[0].getsockname())
  54. for closing in range(2):
  55.     try:
  56.         loop.run_until_complete(server.wait_closed())
  57.     except KeyboardInterrupt:
  58.         if not closing:
  59.             server.close()
  60.             info('closing server')
  61.     else:
  62.         break
  63.     info('done')
  64. loop.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement