32
32
import socketserver
33
33
import sys
34
34
import time
35
- from traceback import print_exc
36
35
from typing import Dict
37
36
from typing import List
38
37
39
38
import gmpy2
39
+ from loguru import logger
40
40
41
41
HOST = "127.0.0.1"
42
42
PORT = 65432
43
43
44
+ _log_format = "[{time:YYYY-MM-DD HH:mm:ss.SSSZZ}] [{level}] [{function}] {message}"
45
+
46
+ logger .remove ()
47
+ logger .add (
48
+ sys .stdout ,
49
+ format = _log_format ,
50
+ level = "DEBUG" ,
51
+ )
52
+ logger .add (
53
+ "gmp_server.log" ,
54
+ format = _log_format ,
55
+ rotation = "50 MB" ,
56
+ level = "DEBUG" ,
57
+ )
58
+
44
59
45
60
class GMPTCPHandler (socketserver .StreamRequestHandler ):
46
61
id_regex = re .compile (r"T(\w+)\s.*" )
@@ -56,7 +71,7 @@ def handle(self):
56
71
try :
57
72
self .data = self .rfile .readline ().strip ()
58
73
except ConnectionResetError as e :
59
- print ( f "connection closed: { type (e ).__name__ } : { e } " )
74
+ logger . info ( "connection closed: {}: {}" , type (e ).__name__ , e )
60
75
break
61
76
62
77
cmd_data = self .data .decode ("utf-8" )
@@ -68,21 +83,20 @@ def handle(self):
68
83
sys .stdout .flush ()
69
84
except Exception as e :
70
85
self .wfile .write (bytes ("SERVER_ERROR\n " , "utf-8" ))
71
- print (e )
72
- print_exc ( )
86
+ logger . error (e )
87
+ logger . exception ( e )
73
88
74
- print ("done\n \n " )
89
+ logger . info ("done" )
75
90
sys .stdout .flush ()
76
91
77
92
def calculate (self , cmd_data : str ):
78
- t_id = ""
79
93
if match := self .id_regex .match (cmd_data ):
80
94
t_id = match .group (1 )
81
95
else :
82
96
raise ValueError ("invalid t_id" )
83
97
84
98
cmds : List [str ] = self .cmd_regex .findall (cmd_data )
85
- print ("cmds:" , cmds )
99
+ logger . info ("cmds: {} " , cmds )
86
100
87
101
mpz_vars : Dict [str , gmpy2 .mpz ] = {}
88
102
mpz_ops : List [List [str ]] = []
@@ -108,23 +122,29 @@ def calculate(self, cmd_data: str):
108
122
match op_type .lower ():
109
123
case "mpz_add" :
110
124
mpz_vars [dst ] = a + b
111
- print (f"\t { dst } = { op [2 ]} + { op [3 ]} ({ a } + { b } )" )
125
+ # print(f"\t{dst} = {op[2]} + {op[3]} ({a} + {b})")
126
+ logger .info ("\t {} = {} + {} ({} + {})" , dst , op [2 ], op [3 ], a , b )
112
127
case "mpz_sub" :
113
128
mpz_vars [dst ] = a - b
114
- print (f"\t { dst } = { op [2 ]} - { op [3 ]} ({ a } - { b } )" )
129
+ # print(f"\t{dst} = {op[2]} - {op[3]} ({a} - {b})")
130
+ logger .info ("\t {} = {} - {} ({} - {})" , dst , op [2 ], op [3 ], a , b )
115
131
case "mpz_mod" :
116
132
mpz_vars [dst ] = a % b
117
- print (f"\t { dst } = { op [2 ]} % { op [3 ]} ({ a } % { b } )" )
133
+ # print(f"\t{dst} = {op[2]} % {op[3]} ({a} % {b})")
134
+ logger .info ("\t {} = {} % {} ({} % {})" , dst , op [2 ], op [3 ], a , b )
118
135
case "mpz_mul" :
119
136
mpz_vars [dst ] = a * b
120
- print (f"\t { dst } = { op [2 ]} * { op [3 ]} ({ a } * { b } )" )
137
+ # print(f"\t{dst} = {op[2]} * {op[3]} ({a} * {b})")
138
+ logger .info ("\t {} = {} * {} ({} * {})" , dst , op [2 ], op [3 ], a , b )
121
139
case "mpz_mul_2exp" :
122
140
mpz_vars [dst ] = a << b
123
141
# mpz_vars[dst] = gmpy2.mpz(gmpy2.mul_2exp(a, b))
124
- print (f"\t { dst } = { op [2 ]} << { op [3 ]} ({ a } << { b } )" )
142
+ # print(f"\t{dst} = {op[2]} << {op[3]} ({a} << {b})")
143
+ logger .info ("\t {} = {} << {} ({} << {})" , dst , op [2 ], op [3 ], a , b )
125
144
case "nop" :
126
145
mpz_vars [dst ] = a
127
- print (f"\t { dst } = { op [2 ]} (NO OPERATION)" )
146
+ # print(f"\t{dst} = {op[2]} (NO OPERATION)")
147
+ logger .info ("\t {} = {} (NO OPERATION)" , dst , op [2 ])
128
148
case "rand_prime" :
129
149
while True :
130
150
x = gmpy2 .mpz_urandomb (self .rng , a - 1 )
@@ -138,18 +158,19 @@ def calculate(self, cmd_data: str):
138
158
x += 1
139
159
mpz_vars [dst ] = x
140
160
break
141
- print (f"\t { dst } = rand_prime({ a } ) ({ mpz_vars [dst ]} )" )
161
+ # print(f"\t{dst} = rand_prime({a}) ({mpz_vars[dst]})")
162
+ logger .info ("\t {} = rand_prime({}) ({})" , dst , a , mpz_vars [dst ])
142
163
143
164
if not dst :
144
165
raise ValueError ("no operations with dst" )
145
166
146
167
# TODO: should we send back all variables here?
147
- # Or only the result? Double-check test_math.c.
168
+ # Or only the result? Double-check BearSSL test_math.c.
148
169
out = bytes (
149
170
f"{ t_id } { dst } { mpz_vars [dst ].digits (16 )} \n " ,
150
- "utf-8" ,
171
+ encoding = "utf-8" ,
151
172
)
152
- print ("out:" , out )
173
+ logger . info ("out: {} " , out )
153
174
self .wfile .write (out )
154
175
155
176
# for name, value in mpz_vars.items():
@@ -161,7 +182,7 @@ def calculate(self, cmd_data: str):
161
182
# )
162
183
163
184
164
- # https://rednafi.com/python/multithreaded_socket_server_signal_handling/
185
+ # TODO: https://rednafi.com/python/multithreaded_socket_server_signal_handling/
165
186
class TCPServer (socketserver .TCPServer ):
166
187
allow_reuse_address = True
167
188
# block_on_close = False
0 commit comments