summaryrefslogtreecommitdiffstats
path: root/python-client/tcprelay.py
diff options
context:
space:
mode:
Diffstat (limited to 'python-client/tcprelay.py')
-rw-r--r--python-client/tcprelay.py148
1 files changed, 0 insertions, 148 deletions
diff --git a/python-client/tcprelay.py b/python-client/tcprelay.py
deleted file mode 100644
index add200c..0000000
--- a/python-client/tcprelay.py
+++ /dev/null
@@ -1,148 +0,0 @@
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3#
4# tcprelay.py - TCP connection relay for usbmuxd
5#
6# Copyright (C) 2009 Hector Martin "marcan" <hector@marcansoft.com>
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 2 or version 3.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
21import usbmux
22import SocketServer
23import select
24from optparse import OptionParser
25import sys
26import threading
27
28class SocketRelay(object):
29 def __init__(self, a, b, maxbuf=65535):
30 self.a = a
31 self.b = b
32 self.atob = ""
33 self.btoa = ""
34 self.maxbuf = maxbuf
35 def handle(self):
36 while True:
37 rlist = []
38 wlist = []
39 xlist = [self.a, self.b]
40 if self.atob:
41 wlist.append(self.b)
42 if self.btoa:
43 wlist.append(self.a)
44 if len(self.atob) < self.maxbuf:
45 rlist.append(self.a)
46 if len(self.btoa) < self.maxbuf:
47 rlist.append(self.b)
48 rlo, wlo, xlo = select.select(rlist, wlist, xlist)
49 if xlo:
50 return
51 if self.a in wlo:
52 n = self.a.send(self.btoa)
53 self.btoa = self.btoa[n:]
54 if self.b in wlo:
55 n = self.b.send(self.atob)
56 self.atob = self.atob[n:]
57 if self.a in rlo:
58 s = self.a.recv(self.maxbuf - len(self.atob))
59 if not s:
60 return
61 self.atob += s
62 if self.b in rlo:
63 s = self.b.recv(self.maxbuf - len(self.btoa))
64 if not s:
65 return
66 self.btoa += s
67 #print "Relay iter: %8d atob, %8d btoa, lists: %r %r %r"%(len(self.atob), len(self.btoa), rlo, wlo, xlo)
68
69class TCPRelay(SocketServer.BaseRequestHandler):
70 def handle(self):
71 print "Incoming connection to %d"%self.server.server_address[1]
72 mux = usbmux.USBMux(options.sockpath)
73 print "Waiting for devices..."
74 if not mux.devices:
75 mux.process(1.0)
76 if not mux.devices:
77 print "No device found"
78 self.request.close()
79 return
80 dev = mux.devices[0]
81 print "Connecting to device %s"%str(dev)
82 dsock = mux.connect(dev, self.server.rport)
83 lsock = self.request
84 print "Connection established, relaying data"
85 try:
86 fwd = SocketRelay(dsock, lsock, self.server.bufsize * 1024)
87 fwd.handle()
88 finally:
89 dsock.close()
90 lsock.close()
91 print "Connection closed"
92
93class TCPServer(SocketServer.TCPServer):
94 allow_reuse_address = True
95
96class ThreadedTCPServer(SocketServer.ThreadingMixIn, TCPServer):
97 pass
98
99HOST = "localhost"
100
101parser = OptionParser(usage="usage: %prog [OPTIONS] RemotePort[:LocalPort] [RemotePort[:LocalPort]]...")
102parser.add_option("-t", "--threaded", dest='threaded', action='store_true', default=False, help="use threading to handle multiple connections at once")
103parser.add_option("-b", "--bufsize", dest='bufsize', action='store', metavar='KILOBYTES', type='int', default=128, help="specify buffer size for socket forwarding")
104parser.add_option("-s", "--socket", dest='sockpath', action='store', metavar='PATH', type='str', default=None, help="specify the path of the usbmuxd socket")
105
106options, args = parser.parse_args()
107
108serverclass = TCPServer
109if options.threaded:
110 serverclass = ThreadedTCPServer
111
112if len(args) == 0:
113 parser.print_help()
114 sys.exit(1)
115
116ports = []
117
118for arg in args:
119 try:
120 if ':' in arg:
121 rport, lport = arg.split(":")
122 rport = int(rport)
123 lport = int(lport)
124 ports.append((rport, lport))
125 else:
126 ports.append((int(arg), int(arg)))
127 except:
128 parser.print_help()
129 sys.exit(1)
130
131servers=[]
132
133for rport, lport in ports:
134 print "Forwarding local port %d to remote port %d"%(lport, rport)
135 server = serverclass((HOST, lport), TCPRelay)
136 server.rport = rport
137 server.bufsize = options.bufsize
138 servers.append(server)
139
140alive = True
141
142while alive:
143 try:
144 rl, wl, xl = select.select(servers, [], [])
145 for server in rl:
146 server.handle_request()
147 except:
148 alive = False