forked from AlbertVos/bitlair-ohm2013-ledstrip-contol
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproxy.py
executable file
·133 lines (109 loc) · 4.2 KB
/
proxy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python3
"""
export ADDR='[("192.168.94.106", 6454), ("192.168.94.104", 6454), ("192.168.94.100", 6454), ("192.168.94.105", 6454), ("192.168.94.103", 6454), ("192.168.94.102", 6454), ("192.168.94.101", 6454)]'
# Using the proxy:
export 'ADDR=[("192.168.94.2", 8000), ("192.168.94.2", 8001),("192.168.94.2", 8002),("192.168.94.2", 8003),("192.168.94.2", 8004),("192.168.94.2", 8005),("192.168.94.2", 8006)]'
cd data/python/ohm2013/strip/
export 'ADDR=[("192.168.1.108", 6454), ("192.168.1.109", 6454)]'
./proxy.py
./fire.py 'addr=[("localhost", 8000)]'
./fire.py 'addr=[("localhost", 8001)]'
./fire.py 'addr=[("localhost", 8500)]'
"""
import socket
import signal
import sys
sys.path.append('../lib')
import select
import os
from strip import getAddr
try:
# Python 2
xrange
except NameError:
# Python 3, xrange is now named range
xrange = range
def hexdump(s):
for b in xrange(0, len(s), 16):
lin = [c for c in s[b : b + 16]]
hxdat = ' '.join('%02X' % ord(c) for c in lin) # pylint: disable=consider-using-f-string
pdat = ''.join((c if 32 <= ord(c) <= 126 else '.' )for c in lin)
print( ' %04x: %-48s %s' % (b, hxdat, pdat) ) # pylint: disable=consider-using-f-string
print()
class Proxy:
localHost = "0.0.0.0"
localPort = 8000
broadcastPort = 8500
addr = []
socks = []
socksSrc = []
socksAddr = []
def __init__(self, addr_ = None):
self.addr = getAddr(addr_)
for i, address in enumerate(self.addr):
# Convert hostname to ip address so when can compare it with address
# data is received from.
self.addr[i] = (socket.gethostbyname(address[0]), address[1])
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#sock.setblocking(0)
sock.bind((self.localHost, self.localPort + i))
self.socks.append(sock)
self.socksSrc.append(())
self.socksAddr.append((self.localHost, self.localPort + i))
print( "Channel ", self.socksAddr[i], " to ", address )
# Add broadcast address to the lists
# Local broadcast port
broadcastAddr = (self.localHost, self.broadcastPort)
# Address to broadcast to
broadcastTo = ("", 6454)
s = self.addr[0][0].split(".")
s[3] = str(255)
broadcastTo = (".".join(s), broadcastTo[1])
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.bind(broadcastAddr)
self.socks.append(sock)
self.socksSrc.append(())
self.addr.append(broadcastTo)
self.socksAddr.append(broadcastAddr)
i = len(self.socks) - 1
print( "Channel ", self.socksAddr[i], " to ", self.addr[i] )
def run(self):
while True:
ready = select.select(self.socks, [], [], 0.5)
index = -1
for i in range(len(ready[0])):
s = ready[0][i]
for j, socks in enumerate(self.socks):
if s == socks:
index = j
break
if index >= 0:
rdata, raddr = self.socks[index].recvfrom(5000)
#print "received data from ", raddr, " @", self.socksAddr[index], \
# " to ", self.addr[index], " len=", len(rdata)
#hexdump(rdata)
# If address of received data is not the target address store it
# as the source address.
#if (len(self.socksSrc[index]) == 0) and (raddr != self.addr[index]):
# self.socksSrc[index] = raddr
# print "adding as src: ", raddr
if raddr != self.addr[index]:
self.socksSrc[index] = raddr
if (raddr == self.socksSrc[index]) and (len(self.socksSrc[index]) > 0):
#print "Send to ", self.addr[index]
self.socks[index].sendto(rdata, self.addr[index])
elif (raddr == self.addr[index]) and (len(self.addr[index]) > 0):
#print "Send to ", self.socksSrc[index]
self.socks[index].sendto(rdata, self.socksSrc[index])
else:
print( "Unknown address", raddr )
def signal_handler(_signal, _frame):
os.kill(os.getpid(), signal.SIGKILL)
sys.exit(0)
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal_handler)
p = Proxy()
p.run()