-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathServiceAPI.py
139 lines (115 loc) · 4.28 KB
/
ServiceAPI.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
134
135
136
137
138
139
import time
import random
from pathlib import Path
import pika
import json
import importlib
from importlib import util
import unicodedata
import sys, os, signal
from utility import *
def handleSIGCHLD(param1, param2):
os.waitpid(-1, os.WNOHANG)
def Log(message):
A = 1
#sendLog('ServiceApi', message)
def Api(ch, method, properties, data):
npid = os.fork()
if npid != 0:
return
if len(data.strip()) == 0:
Log("NO JSON")
sys.exit(0)
# CLEAN DATA
result = cleanData(data)
# CHECK API FORMAT
data, checked = checkedApiJSON(result)
if not checked:
sys.exit(0)
Param = data['Api']['Param'] # JSON string: {'Login': 'user', 'Password': 'encoded secret'}
cltIP = '127.0.0.1' # client IP addr
Param['__IP__'] = cltIP # Add IP to Param
ApiReq = data['Api']['Name'].split('.') # nome do recurso em api/<recurso>
Api = ApiReq[0].capitalize() # nome do arquivo py api/<recurso>/<Recurso.py>
modName = "api.{}.{}".format(ApiReq[0], Api) # api.autenticador.Autenticador exemplo para o caso de autenticador
clsName = ApiReq[1] # nome da classe em Autenticador.py
# CHECK REQUESTED MODULE AND CLASS
if checkedRequest(modName, clsName):
sys.exit(0)
modObj = importlib.import_module(modName) # import das classes disponiveis no recurso
modClass = getattr(modObj, clsName) # utiliza classe solicitada, no caso Login
modInst = modClass(Param) # instancia de Login passando metodo e JSON de parametros
# VERIFY EXECUTE METHOD
if not hasattr(modInst, 'Execute'):
message = (f"{modObj} does not have Execute()")
Log(message)
sys.exit(0)
# EXECUTE METHOD EXECUTE
message = (f"{modName} {clsName}")
Log(message)
result = modInst.Execute() # Metodo comum a todas as classes analisa JSON e processa
# SEND RESPONSE
Result = f"{result}"
sendMessage(data['Rsp'], Result)
sys.exit(0)
def checkedRequest(modName, className):
try:
myapi = importlib.util.find_spec(modName)
except:
message = ("Module Api not found")
Log(message)
return False
modObj = importlib.import_module(modName) # import das classes disponiveis no recurso
if not hasattr(modObj, className):
message = (f"{modObj} does not have {className}")
Log(message)
return False
def checkedApiJSON(result):
# VERIFICA QUALIDADE JSON
try:
data = json.loads(result) # ENCODED JSON STRING TO PYTHON DATA
except:
message = ("Incorrect JSON format")
Log(message)
return (result, False)
if type(data) is not dict:
message = ("Wrong object type")
Log(message)
return (result, False)
if 'Api' not in list(data.keys()):
message = ("Api not present")
Log(message)
return (result, False)
if 'Rsp' not in list(data.keys()):
message = ("Rsp not present")
Log(message)
return (result, False)
if 'Name' not in list(data['Api'].keys()):
message = ("Api.Name not present")
Log(message)
return (result, False)
if 'Param' not in list(data['Api'].keys()):
message = ("Api.Param not present")
Log(message)
return (result, False)
return (data, True)
signal.signal(signal.SIGCHLD, handleSIGCHLD)
connectURL = konstantes('PIKA', 'url')
exchange = konstantes('PIKA', 'exchange_direct')
queue = konstantes('PIKA', 'queue')
parametros = pika.URLParameters(connectURL)
connect = pika.BlockingConnection(parametros)
channel = connect.channel()
channel.exchange_declare(exchange=exchange, exchange_type='direct')
channel.queue_declare(queue = queue)
channel.queue_bind(exchange=exchange, queue=queue)
channel.basic_consume(queue, on_message_callback=Api, auto_ack=True, exclusive=False)
info = ('[*] Waiting for messages')
print(info)
Log(info)
'''
npid = os.fork()
if npid != 0:
sys.exit(0)
'''
channel.start_consuming()