| 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()
|
|---|