All pastes #737884 Raw Edit

portforward.py

public python v1 · immutable
·published 2007-10-15 20:27 UTC
rendered paste body
#! /usr/bin/env python#-*- coding: utf-8 -*-import socketimport threadingclass PipeThread(threading.Thread):	pipes = []	def __init__(self, sockInput, sockOutput, name):		threading.Thread.__init__(self)		self.setName(name)		self.pipes.append(self)		self.mydata = threading.local()		self.sockInput = sockInput		self.sockOutput = sockOutput	def run(self):		print self.getName(), "started !!"		while True:			try:				self.mydata.buffer = self.sockInput.recv(1024)				if not self.mydata.buffer:					break;				print self.getName(), " :", self.mydata.buffer[0:48]				self.sockOutput.send(self.mydata.buffer)			except:				break		print self.getName(), "ended !!"		self.sockInput.close()		self.sockOutput.close()		self.pipes.remove(self)class PipeHole(threading.Thread):	def __init__(self, portInput, host, portOutput):		threading.Thread.__init__(self)		print "Redirecting : localhost:%s -> %s:%s" % (portInput, host, portOutput)		self.hostname = hostname		self.portOutput = portOutput		# Wait for incomings clients		self.sockMaster = socket.socket(socket.AF_INET, socket.SOCK_STREAM)		self.sockMaster.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)		self.sockMaster.bind(('', portInput))		self.sockMaster.listen(5)	def run(self):		while True:			# Accept a client connection			sockClient, addr = self.sockMaster.accept()			sRemote = socket.gethostbyaddr(addr[0])			print "Connection :", sRemote[0], sRemote[2] , ":", sockClient.getpeername()[1]			# Connect to server			sockServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)			sockServer.connect((self.hostname, self.portOutput))			PipeThread(sockClient, sockServer, "Client").start()			PipeThread(sockServer, sockClient, "Server").start()		#self.sockMaster.close()if __name__ == "__main__":	import sys	try:		port = int(sys.argv[1])		hostname = sys.argv[2]		try:			new_port = int(sys.argv[3])		except IndexError:			new_port = port	except (IndexError, ValueError):		print "Usage: %s port hostname [new_port]" % sys.argv[0]		sys.exit(1)	PipeHole(port, hostname, new_port).start()	print "Shutting down !!"	sys.exit(0)