1 | #!/usr/bin/env python
|
---|
2 | import SocketServer, time, socket, threading, os, sys
|
---|
3 | def usage():
|
---|
4 | print "Usage: "+__file__+" unix_socket tcp_port"
|
---|
5 | if len(sys.argv)!=3:
|
---|
6 | usage()
|
---|
7 | sys.exit(1)
|
---|
8 | myHost = '' # server machine, '' means local host
|
---|
9 | myPort = int(sys.argv[2])
|
---|
10 | comSock = sys.argv[1] # listen on a non-reserved port number
|
---|
11 | reader=[]
|
---|
12 |
|
---|
13 | def now():
|
---|
14 | return time.ctime(time.time())
|
---|
15 |
|
---|
16 | class ReadThread(threading.Thread):
|
---|
17 | def __init__(self,server,client):
|
---|
18 | self.server=server
|
---|
19 | self.client=client
|
---|
20 | threading.Thread.__init__ ( self )
|
---|
21 | def run(self):
|
---|
22 | while 1:
|
---|
23 | data=self.server.recv(8)
|
---|
24 | if not data: return 1
|
---|
25 | if len(reader)>0:
|
---|
26 | if data==reader[0]:
|
---|
27 | reader.pop[0]
|
---|
28 | else:
|
---|
29 | self.client.send(data)
|
---|
30 | else:
|
---|
31 | self.client.send(data)
|
---|
32 |
|
---|
33 | class WriteThread(threading.Thread):
|
---|
34 | def __init__(self,server,client):
|
---|
35 | self.server=server
|
---|
36 | self.client=client
|
---|
37 | threading.Thread.__init__ ( self )
|
---|
38 | def run(self):
|
---|
39 | while 1:
|
---|
40 | data=self.client.recv(8)
|
---|
41 | if not data: return 1
|
---|
42 | reader.append(data)
|
---|
43 | self.server.send(data)
|
---|
44 |
|
---|
45 | class MyClientHandler(SocketServer.BaseRequestHandler):
|
---|
46 |
|
---|
47 | def handle(self):
|
---|
48 | print self.client_address, now()
|
---|
49 | time.sleep(5)
|
---|
50 | unix=socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
---|
51 | if os.path.exists(comSock):
|
---|
52 | try:
|
---|
53 | unix.connect(comSock)
|
---|
54 | except Exception:
|
---|
55 | self.request.send('Port in use')
|
---|
56 | self.request.close()
|
---|
57 | unix.close()
|
---|
58 | else:
|
---|
59 | self.request.send('Vbox is not running')
|
---|
60 | unix.close()
|
---|
61 | self.request.close()
|
---|
62 | t1=ReadThread(unix,self.request)
|
---|
63 | t1.start()
|
---|
64 | t2=WriteThread(unix,self.request)
|
---|
65 | t2.start()
|
---|
66 | while t1.isAlive() and t2.isAlive():
|
---|
67 | pass
|
---|
68 | self.request.close()
|
---|
69 | unix.close()
|
---|
70 |
|
---|
71 | # make a threaded server, listen/handle clients forever
|
---|
72 | myaddr = (myHost, myPort)
|
---|
73 | server = SocketServer.ThreadingTCPServer(myaddr, MyClientHandler)
|
---|
74 | server.serve_forever()
|
---|