Moving some shared code to shared/core.py
parent
d71768b9c3
commit
65cab5df9c
@ -0,0 +1 @@
|
||||
from dist import core
|
@ -0,0 +1 @@
|
||||
|
Binary file not shown.
@ -0,0 +1,95 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
################################
|
||||
# Configuration starts here
|
||||
|
||||
cert_path = '/home/sven/ssl/cert'
|
||||
key_path = '/home/sven/ssl/private'
|
||||
|
||||
# Configuration ends here
|
||||
################################
|
||||
|
||||
import socket, ssl, select
|
||||
from shared.core import *
|
||||
|
||||
def remove_from_list(ls, val):
|
||||
return [value for value in ls if value is not val]
|
||||
|
||||
client_list = []
|
||||
client_map = {}
|
||||
select_inputs = []
|
||||
select_outputs = []
|
||||
|
||||
class Client:
|
||||
buff = ""
|
||||
channel_map = {}
|
||||
|
||||
def __init__(self, connstream):
|
||||
self.stream = connstream
|
||||
self.channel_map[0] = Channel(self, EchoHandler())
|
||||
|
||||
def process_data(self, data):
|
||||
self.buff += data
|
||||
stack = self.buff.split(EOC)
|
||||
self.buff = stack.pop()
|
||||
|
||||
for chunk in stack:
|
||||
self.process_chunk(chunk)
|
||||
|
||||
def process_chunk(self, chunk):
|
||||
if len(chunk) > 2:
|
||||
channel_identifier = chunk[:2]
|
||||
data = chunk[2:]
|
||||
|
||||
channel_numeric = to_numeric(channel_identifier)
|
||||
|
||||
if channel_numeric in self.channel_map:
|
||||
self.channel_map[channel_numeric].process_chunk(data)
|
||||
else:
|
||||
print "WARNING: Received data on non-existent channel %d" % channel_numeric
|
||||
|
||||
|
||||
|
||||
bindsocket = socket.socket()
|
||||
bindsocket.bind(('0.0.0.0', 9151))
|
||||
bindsocket.listen(5)
|
||||
|
||||
select_inputs = [ bindsocket ]
|
||||
|
||||
while select_inputs:
|
||||
readable, writable, error = select.select(select_inputs, select_outputs, select_inputs)
|
||||
|
||||
for sock in readable:
|
||||
try:
|
||||
if sock is bindsocket:
|
||||
newsocket, fromaddr = bindsocket.accept()
|
||||
connstream = ssl.wrap_socket(newsocket,
|
||||
server_side=True,
|
||||
certfile=cert_path,
|
||||
keyfile=key_path,
|
||||
ssl_version=ssl.PROTOCOL_TLSv1)
|
||||
|
||||
new_client = Client(connstream)
|
||||
|
||||
select_inputs.append(connstream)
|
||||
client_map[connstream.fileno()] = new_client
|
||||
client_list.append(new_client)
|
||||
else:
|
||||
data = sock.recv(1024)
|
||||
|
||||
if data:
|
||||
cur_client = client_map[sock.fileno()]
|
||||
cur_client.process_data(data)
|
||||
else:
|
||||
select_inputs = remove_from_list(select_inputs, sock)
|
||||
print "NOTICE: Client disconnected"
|
||||
except ssl.SSLError, err:
|
||||
if err.args[0] == ssl.SSL_ERROR_WANT_READ:
|
||||
select.select([sock], [], [])
|
||||
elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE:
|
||||
select.select([], [sock], [])
|
||||
else:
|
||||
raise
|
||||
|
||||
|
||||
print "Server socket closed, exiting..."
|
Binary file not shown.
@ -0,0 +1 @@
|
||||
from master import core
|
@ -0,0 +1 @@
|
||||
|
@ -0,0 +1 @@
|
||||
#!/usr/bin/python
|
@ -0,0 +1 @@
|
||||
from node import core
|
@ -0,0 +1 @@
|
||||
|
Binary file not shown.
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
################################
|
||||
# Configuration starts here
|
||||
|
||||
allowed_certs = '/home/sven/ssl/allowed'
|
||||
|
||||
# Configuration ends here
|
||||
################################
|
||||
|
||||
import socket, ssl, time, math
|
||||
from shared.core import *
|
||||
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
ssl_sock = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED, ca_certs=allowed_certs)
|
||||
ssl_sock.connect(('localhost', 9151))
|
||||
|
||||
ssl_sock.write(to_identifier(0) + 'test data' + EOC + to_identifier(4190) + 'SAMPLEDATA' + EOC)
|
||||
|
||||
print ssl_sock.read()[2:]
|
||||
|
||||
ssl_sock.close()
|
Binary file not shown.
Binary file not shown.
@ -0,0 +1,34 @@
|
||||
import math
|
||||
|
||||
EOC = "\0"
|
||||
|
||||
def to_numeric(identifier):
|
||||
return ((ord(identifier[:1]) - 1) * 255) + (ord(identifier[1:]) - 1)
|
||||
|
||||
def to_identifier(numeric):
|
||||
return chr(int(math.floor(numeric / 255) + 1)) + chr((numeric % 255) + 1)
|
||||
|
||||
class Channel:
|
||||
numeric = 0
|
||||
binary = False
|
||||
handler = None
|
||||
client = None
|
||||
|
||||
def __init__(self, client, handler, binary=False):
|
||||
self.handler = handler
|
||||
self.binary = binary
|
||||
self.client = client
|
||||
|
||||
def process_chunk(self, chunk):
|
||||
self.handler.process(chunk)
|
||||
|
||||
def send(self, data):
|
||||
self.client.stream.send(to_identifier(self.numeric) + data + EOC)
|
||||
|
||||
class Handler:
|
||||
def process(self, chunk):
|
||||
pass
|
||||
|
||||
class EchoHandler(Handler):
|
||||
def process(self, chunk):
|
||||
print "Received %s" % chunk
|
Binary file not shown.
Loading…
Reference in New Issue