server.py 5.27 KB
Newer Older
Ismail Moumni's avatar
Ismail Moumni committed
1
# authors: Julien DAVID & Ismail MOUMNI
Ismail-Moumni's avatar
Ismail-Moumni committed
2
import socket
Ismail Moumni's avatar
Ismail Moumni committed
3
import json
Ismail Moumni's avatar
Ismail Moumni committed
4
import os
Ismail Moumni's avatar
Ismail Moumni committed
5
import sys
Ismail Moumni's avatar
edit    
Ismail Moumni committed
6
import database.database as db
Ismail Moumni's avatar
Ismail Moumni committed
7
sys.path.append(os.path.realpath('../softwares/'))
Ismail Moumni's avatar
Ismail Moumni committed
8

Ismail Moumni's avatar
Ismail Moumni committed
9
__RDOS_Dict__ = {}
Ismail Moumni's avatar
Ismail Moumni committed
10
11

# tools List
Ismail Moumni's avatar
Ismail Moumni committed
12
__RDOS_Tool__ = {}
Ismail Moumni's avatar
Ismail Moumni committed
13

Ismail Moumni's avatar
Ismail Moumni committed
14

Ismail Moumni's avatar
Ismail Moumni committed
15
16
17
18
19
class RdosServer:

    # Function server_conn creates a socket and listens on port 9393
    # Function input address : SERVER IP ADRESS & Port server Port
    # Function output query send from client to server
Ismail Moumni's avatar
Ismail Moumni committed
20
21
22
23
24
25
    def server_conn(address, PORT):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv:
            serv.bind((address, PORT))
            # Listening to 5 CLients
            serv.listen(5)
            # accepting the connection from client and getting client IP
Ismail Moumni's avatar
Ismail Moumni committed
26
            conn, addr = serv.accept()
Ismail Moumni's avatar
Ismail Moumni committed
27
28
29
30
31
32
        while True:
            if conn:
                print('Connexion acceptee depuis l IP : ', addr)
                # Receiving Data from Client
                data = conn.recv(4096)
                query = (json.loads(data.decode('utf-8')))
Ismail Moumni's avatar
Ismail Moumni committed
33
                print("Requete reçu : ", query)
Ismail Moumni's avatar
Ismail Moumni committed
34
35
                if(query is not None):
                    # Sending GENERATORS
Ismail Moumni's avatar
Ismail Moumni committed
36
                    if (query_valid(query)):
Ismail Moumni's avatar
Ismail Moumni committed
37
38
39
                        response = db.db_generators()
                        conn.send(bytes(json.dumps(response), "utf-8"))
                    # Inserting in DATABASE
Ismail Moumni's avatar
Ismail Moumni committed
40
41
                    else:
                        db_insert(conn, check_and_complete_parameters(query))
Ismail Moumni's avatar
Ismail Moumni committed
42
43


Ismail Moumni's avatar
Ismail Moumni committed
44
# Function query_valwid matches the query send from client side
Ismail Moumni's avatar
Ismail Moumni committed
45
#  with the the parameter dict
Ismail Moumni's avatar
Ismail Moumni committed
46
# Function input dictionary from client
Ismail Moumni's avatar
Ismail Moumni committed
47
48
# Function output boolean true if match else False
def query_valid(data: dict):
Ismail Moumni's avatar
Ismail Moumni committed
49
50
51
52
53
54
55
56
    if data is not None:
        if 'parameters' in data:
            if (data['parameters'] != '') & (len(data) <= 2):
                return True
            else:
                return False
    else:
        raise Exception("Dictionnaire Vide!!")
Ismail Moumni's avatar
Ismail Moumni committed
57
58
59


# Function json_loads changes a json file into a Dict
Ismail Moumni's avatar
Ismail Moumni committed
60
# Function json_loads returns a dictionary
Ismail Moumni's avatar
Ismail Moumni committed
61
def json_to_dict(js):
Ismail Moumni's avatar
Ismail Moumni committed
62
63
64
65
66
    if js is not None:
        data = json.loads(js)
        return data
    else:
        raise Exception("Dictionnaire Vide!!")
Ismail Moumni's avatar
Ismail Moumni committed
67
68


Ismail Moumni's avatar
Ismail Moumni committed
69
# Function db_req sends a request to get parameters of tools from database
Ismail Moumni's avatar
Ismail Moumni committed
70
# Function takes a dictionary for input
Ismail Moumni's avatar
Ismail Moumni committed
71
72
# Function return a Dict containing tool parameters and default parameters
def db_req(tool: dict):
Ismail Moumni's avatar
Ismail Moumni committed
73
74
75
76
77
    if dict is not None:
        tool_dict = db.getParameters(tool)
        return tool_dict
    else:
        raise Exception("Dictionnaire Vide!!")
Ismail Moumni's avatar
Ismail Moumni committed
78
79


Ismail Moumni's avatar
Ismail Moumni committed
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# Function match_dict returns non existing fields in a dict
# Function input biblio and dict
# Function returns a list containing missing values
def missing_keys(biblio: dict, gen: dict):
    missing = []
    if(biblio is not None and gen is not None):
        for key in biblio:
            if key not in gen:
                missing.append(key)
        return missing
    else:
        raise Exception("Dictionnaire Vide!!")


Ismail Moumni's avatar
Ismail Moumni committed
94
95
96
# Function match_query_dict matches two dictionaries
# Function input takes 2 dictionaries to match
# Function output return trur if dictionaries matches else raise a value error exception
Ismail Moumni's avatar
Ismail Moumni committed
97
98
99
100
def match_query_dict(biblio: dict, data: dict):
    if biblio is not None and data is not None:
        return biblio.keys() == data.keys()
    else:
Ismail Moumni's avatar
Ismail Moumni committed
101
        raise ValueError("Error Dict Values ")
Ismail Moumni's avatar
Ismail Moumni committed
102
103


Ismail Moumni's avatar
Ismail Moumni committed
104
# Function check_and_complete_parameters verifies json send from client to server by matching it with database query
Ismail Moumni's avatar
Ismail Moumni committed
105
106
# Function input takes a dictionary
# Function output returns query if it matches with database query keys if not it raises an error
Ismail Moumni's avatar
Ismail Moumni committed
107
def check_and_complete_parameters(data: dict):
Ismail Moumni's avatar
Ismail Moumni committed
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
    if data is not None:
        tool = data.keys().strip('[]')
        s = db.getParameters(data['tool'])
        parameter = {}
        query = {}
        if s is not None:
            gen = s[0]
            gen_default = s[1]
            parameter = gen_default
            query = data.get(tool)
            if match_query_dict(gen.get(tool), query):
                for a in query:
                    if query[a] == "":
                        print(query[a])
                        query[a] = parameter.get(a)
                return query
            else:
                raise Exception("Query Doesn't match")
Ismail Moumni's avatar
Ismail Moumni committed
126
        else:
Ismail Moumni's avatar
Ismail Moumni committed
127
            raise Exception("Error Database")
Ismail Moumni's avatar
Ismail Moumni committed
128
    else:
Ismail Moumni's avatar
Ismail Moumni committed
129
        raise Exception("Dictionnaire Vide!!")
Ismail Moumni's avatar
Ismail Moumni committed
130
131
132
133
134
135


# Function db_generators returns database generators
# Function takes a dictionary request from client side
# Function returns all database generators or raises an error if request doesn't match
def db_generators(req: dict):
Ismail Moumni's avatar
Ismail Moumni committed
136
137
138
139
140
141
    if req is not None:
        match = {"request": "generators"}
        if(req == match):
            s = db.get_generators()
            return s
        else:
Ismail Moumni's avatar
Ismail Moumni committed
142
            raise Exception("Dictionnaire non Valid")
Ismail Moumni's avatar
Ismail Moumni committed
143
    else:
Ismail Moumni's avatar
Ismail Moumni committed
144
        raise Exception("Dictionnaire Vide!!")
Ismail Moumni's avatar
Ismail Moumni committed
145
146
147
148
149
150
151


# Function db_insert send a query to insert in database by socket
# Function db_insert takes a socket and dictionary for input
# Function db_insert returns a string if query send
def db_insert(s: socket, req: dict):
    if(req is not None):
Ismail Moumni's avatar
Ismail Moumni committed
152
153
154
155
156
        ins = db.insert_query(req)
        s.send(bytes(json.dumps(ins), "utf-8"))
        print("Query send")
    else:
        raise Exception("Invalid Query")
Ismail Moumni's avatar
Ismail Moumni committed
157
158
159
160
161


if __name__ == '__main__':
    # TEST FOR Docker
    RdosServer.server_conn('127.0.0.1', '9393')