-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcliente.py
executable file
·155 lines (121 loc) · 4.4 KB
/
cliente.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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from comum import *
import random
import re
import signal
manterRecebeRespostaCmdVivo = True
manterConversaUsuario = True
servidores = None
threads = list()
max_key = None
# printa o menu principal em stdout
def printaMenuPrincipal():
printa_positivo('Bem vindo. Digite uma das opções:')
printa_neutro(' CREATE <chave> <valor> para criar um item no mapa')
printa_neutro(' READ <chave> para receber um item pela sua chave')
printa_neutro(' UPDATE <chave> <valor> para alterar um item no mapa')
printa_neutro(' DELELE <chave> para remover um item pela sua chave')
printa_neutro(' SAIR, para sair')
printa_colorido(' > ', 'green')
# pega o input do teclado
def pegaInput():
inp = raw_input()
sys.stdin.flush() # limpa o buffer stdin
return inp
# esta função serve apenas para pausar a execução
def esperaContinua():
printa_neutro('Pressione ENTER para continuar')
_nada = pegaInput()
# limpa o console
def limpaConsole():
os.system('clear')
def trataRetorno(resposta_grpc):
status = resposta_grpc.result().resposta
if re.match(r'Ok', status) == None:
printa_negativo(status)
else:
printa_positivo(status)
def trataComando(cmd, opcao=""):
chave = ''
valor = ''
try:
chave = int(cmd.split(' ')[1])
valor = cmd.split(' ')[2]
except IndexError:
pass
return chave, valor
def encerraCliente(signal=None, frame=None):
global manterRecebeRespostaCmdVivo
global manterConversaUsuario
printa_negativo('Encerrando aplicação =(')
manterConversaUsuario = False
if not manterConversaUsuario:
time.sleep(5)
sys.exit()
def criaStub():
servidor = random.choice(servidores)
endereco = '{}:{}{}'.format(IP_SOCKET, PREFIXO_PORTA, servidor)
channel = grpc.insecure_channel(endereco)
return interface_pb2_grpc.ManipulaMapaStub(channel)
def notificaComandoInvalido(msg):
printa_negativo(msg)
esperaContinua()
def conversaUsuario():
while manterConversaUsuario:
limpaConsole()
printaMenuPrincipal()
inputUsuario = pegaInput().strip()
opcao = inputUsuario.split(' ')[0]
if opcao[:4].lower() == 'sair': encerraCliente()
if len(inputUsuario) == 0: continue
c, v = trataComando(inputUsuario)
try:
if c < 0:
notificaComandoInvalido('Chave inválida')
continue
except TypeError:
notificaComandoInvalido('Chave inválida!')
continue
if c > max_key:
notificaComandoInvalido('Chave inválida!')
continue
stub = criaStub()
if opcao[:6].lower() == 'create':
future = stub.CriaItem.future(interface_pb2.msgItem(chave=c ,valor=v))
future.add_done_callback(trataRetorno)
esperaContinua()
elif opcao[:4].lower() == 'read':
future = stub.LeItem.future(interface_pb2.msgItem(chave=c))
future.add_done_callback(trataRetorno)
esperaContinua()
elif opcao[:6].lower() == 'update':
future = stub.AtualizaItem.future(interface_pb2.msgItem(chave=c, valor=v))
future.add_done_callback(trataRetorno)
esperaContinua()
elif opcao[:6].lower() == 'delete':
future = stub.DeletaItem.future(interface_pb2.msgItem(chave=c))
future.add_done_callback(trataRetorno)
esperaContinua()
else:
limpaConsole()
notificaComandoInvalido('Comando inválido!')
def configura_cliente():
fio1 = Thread(target=conversaUsuario)
fio1.start()
def le_parametros_banco():
global max_key
dbparams = yaml.load(open(DB_PARAMS, 'r'))
max_key = 2 ** int(dbparams['bits']) - 1
def main():
global servidores
try:
servidores = np.fromfile(SERVIDORES, sep='\n', dtype=np.int)
signal.signal(signal.SIGINT, encerraCliente)
le_parametros_banco()
configura_cliente()
except OSError:
printa_negativo("Arquivo de servidores inexistente!")
return
if __name__ == '__main__':
main()