79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
import pickle
|
|
import socket
|
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
from common import util, models
|
|
from dsst_server import read_functions, write_functions
|
|
from dsst_server.func_proxy import FunctionProxy
|
|
from dsst_server.data_access import sql
|
|
|
|
PORT = 12345
|
|
HOST = socket.gethostname()
|
|
BUFFER_SIZE = 1024
|
|
|
|
|
|
class DsstServer:
|
|
def __init__(self):
|
|
self.socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
print('Created socket')
|
|
|
|
self.socket_server.bind((HOST, PORT))
|
|
print(f'Bound socket to {PORT} on host {HOST}')
|
|
|
|
self.read_actions = util.list_class_methods(read_functions.ReadFunctions)
|
|
self.write_actions = util.list_class_methods(write_functions.WriteFunctions)
|
|
sql.db.init('dsst', user='dsst', password='dsst')
|
|
|
|
self.key_access = {'a': self.read_actions,
|
|
'b': self.read_actions + self.write_actions}
|
|
|
|
def run(self):
|
|
self.socket_server.listen(5)
|
|
print('Socket is listening')
|
|
|
|
while True:
|
|
client, address = self.socket_server.accept()
|
|
try:
|
|
print(f'Connection from {address}')
|
|
data = util.recv_msg(client)
|
|
request = pickle.loads(data)
|
|
print(f'Request: {request}')
|
|
# Validate auth key in request
|
|
key = request.get('auth_key')
|
|
if key not in self.key_access:
|
|
util.send_msg(client, pickle.dumps({'success': False, 'message': 'Auth Key invalid'}))
|
|
print(f'Rejected request from {address}. Auth key invalid ({key})')
|
|
continue
|
|
# Check read functions
|
|
action_name = request.get('action')
|
|
if action_name in self.key_access[key]:
|
|
action = getattr(FunctionProxy, action_name)
|
|
value = action(request.get('args'))
|
|
response = {'success': True, 'data': value}
|
|
util.send_msg(client, pickle.dumps(response))
|
|
continue
|
|
else:
|
|
msg = f'Action does not exist on server ({request.get("action")})'
|
|
util.send_msg(client, pickle.dumps({'success': False, 'message': msg}))
|
|
except Exception as e:
|
|
print(e)
|
|
finally:
|
|
client.close()
|
|
print('Connection to client closed')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
server = DsstServer()
|
|
try:
|
|
server.run()
|
|
except KeyboardInterrupt:
|
|
print('Server stopped')
|
|
server.socket_server.close()
|
|
try:
|
|
sys.exit(0)
|
|
except SystemExit:
|
|
os._exit(0)
|