easy-utils-dev 2.164__tar.gz → 2.166__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/PKG-INFO +1 -1
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/ne1830PSS.py +38 -32
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/uiserver.py +69 -23
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev.egg-info/PKG-INFO +1 -1
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/setup.py +1 -1
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/MANIFEST.in +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/EasySsh.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/Events.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/FastQueue.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/NameObject.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/__init__.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/abortable.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/brevosmtp.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/check_license.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/cplib.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/custom_env.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/debugger.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/easy_oracle.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/encryptor.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/ept.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/ept_sql/create_dirs.sql +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/ept_sql/create_ept_tables.sql +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/exceptions.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/filescompressor.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/generate_license.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/keycloakapi.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/lralib.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/nsp_kafka.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/openid_server.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/optics_utils.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/require_auth.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/simple_sqlite.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/temp_memory.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/utils.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/winserviceapi.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/wsnoclib.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/wsselib.py +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev.egg-info/SOURCES.txt +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev.egg-info/dependency_links.txt +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev.egg-info/requires.txt +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev.egg-info/top_level.txt +0 -0
- {easy_utils_dev-2.164 → easy_utils_dev-2.166}/setup.cfg +0 -0
|
@@ -10,6 +10,7 @@ from easy_utils_dev.encryptor import initCryptor
|
|
|
10
10
|
from easy_utils_dev.utils import pingAddress , lget , getTimestamp
|
|
11
11
|
from easy_utils_dev import exceptions
|
|
12
12
|
from typing import Optional
|
|
13
|
+
import re
|
|
13
14
|
|
|
14
15
|
class PSS1830 :
|
|
15
16
|
def __init__(self ,
|
|
@@ -19,6 +20,7 @@ class PSS1830 :
|
|
|
19
20
|
file_name=None,
|
|
20
21
|
debug_home_path=None,
|
|
21
22
|
trust_env_log_path=True,
|
|
23
|
+
connect_to_standby_ec=False,
|
|
22
24
|
debugger_kwargs: Optional[DEBUGGER] = {}
|
|
23
25
|
) -> None:
|
|
24
26
|
self.port = None
|
|
@@ -54,7 +56,9 @@ class PSS1830 :
|
|
|
54
56
|
self.full_buffer=''
|
|
55
57
|
self.pssRelease = None
|
|
56
58
|
self.maxConnectAttempt=3
|
|
57
|
-
|
|
59
|
+
|
|
60
|
+
self.connect_to_standby_ec = connect_to_standby_ec
|
|
61
|
+
|
|
58
62
|
self.currentConnectAttempt=0
|
|
59
63
|
self.auto_enable_tcp_forward=auto_enable_tcp_forward
|
|
60
64
|
self.tcpForwardStatus=None
|
|
@@ -1004,40 +1008,42 @@ class PSS1830 :
|
|
|
1004
1008
|
self.logger.debug(f"get_allcards : final return {cards_return}")
|
|
1005
1009
|
return cards_return
|
|
1006
1010
|
|
|
1007
|
-
|
|
1011
|
+
|
|
1008
1012
|
def get_xcs(self) :
|
|
1009
|
-
xcs = self.cli_execute(
|
|
1010
|
-
xcs = xcs.splitlines()
|
|
1013
|
+
xcs = self.cli_execute("show xc *")
|
|
1011
1014
|
xcsList = []
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1015
|
+
|
|
1016
|
+
row_regex = re.compile(
|
|
1017
|
+
r"^(?P<aEnd>\S+)\s+"
|
|
1018
|
+
r"(?P<zEnd>\S+)\s+"
|
|
1019
|
+
r"(?P<freq>\d+\.\d+)\s+"
|
|
1020
|
+
r"(?P<id>\d+)\s+"
|
|
1021
|
+
r"(?:(?P<label>\S.*?~)\s+)?"
|
|
1022
|
+
r"(?P<width>\d+\.\d+)\s+"
|
|
1023
|
+
r"(?P<type>\S+)\s+"
|
|
1024
|
+
r"(?P<admin>Up|Down)\s+"
|
|
1025
|
+
r"(?P<oper>Up|Down)\s+"
|
|
1026
|
+
r"(?P<dir>Uni|Bi)"
|
|
1027
|
+
)
|
|
1028
|
+
|
|
1029
|
+
for ln in xcs.splitlines():
|
|
1030
|
+
ln = ln.strip()
|
|
1031
|
+
if not ln:
|
|
1027
1032
|
continue
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
"
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1033
|
+
|
|
1034
|
+
m = row_regex.search(ln)
|
|
1035
|
+
if not m:
|
|
1036
|
+
continue # skip header/separators automatically
|
|
1037
|
+
|
|
1038
|
+
data = m.groupdict()
|
|
1039
|
+
# normalize missing label to empty string instead of None
|
|
1040
|
+
if data.get("label") is None:
|
|
1041
|
+
data["label"] = ""
|
|
1042
|
+
|
|
1043
|
+
xcsList.append(data)
|
|
1044
|
+
|
|
1045
|
+
return xcsList
|
|
1046
|
+
|
|
1041
1047
|
|
|
1042
1048
|
def showShelf(self , shelfId=1) :
|
|
1043
1049
|
self.logger.debug(f'show shelf for shelfId={shelfId}')
|
|
@@ -83,29 +83,74 @@ class Stream :
|
|
|
83
83
|
} , to=sid )
|
|
84
84
|
|
|
85
85
|
class Response :
|
|
86
|
-
def __init__(self) :
|
|
86
|
+
def __init__(self, socket : SocketIO , request : request ) :
|
|
87
87
|
self.success = self.ok
|
|
88
88
|
self.failure = self.error
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
self.socket = socket
|
|
90
|
+
self.request = request
|
|
91
|
+
|
|
92
|
+
def _emit(self , data, role , options={} ) :
|
|
93
|
+
self.socket.emit('/stream/notify' , { **data , '_role' : role , '_options' : options } , to=self.request.sid)
|
|
94
|
+
|
|
95
|
+
def ok(self , result=[] , message=None , alert=False, toast=False , options={} , **kwargs) :
|
|
96
|
+
role = None
|
|
97
|
+
if alert :
|
|
98
|
+
role = 'alert'
|
|
99
|
+
elif toast :
|
|
100
|
+
role = 'toast'
|
|
91
101
|
timestamp = getTimestamp()
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
102
|
+
r = {'status' : 200 , 'message' : message , 'result' : result , **kwargs, 'timestamp' : timestamp}
|
|
103
|
+
if role :
|
|
104
|
+
self._emit( r , role, options)
|
|
105
|
+
return r
|
|
106
|
+
|
|
107
|
+
def error(self , message=None , alert=False, toast=False , options={} , **kwargs) :
|
|
108
|
+
role = None
|
|
109
|
+
if alert :
|
|
110
|
+
role = 'alert'
|
|
111
|
+
elif toast :
|
|
112
|
+
role = 'toast'
|
|
95
113
|
timestamp = getTimestamp()
|
|
96
|
-
|
|
114
|
+
r = {'status' : 400 , 'message' : message , **kwargs , 'timestamp' : timestamp}
|
|
115
|
+
if role :
|
|
116
|
+
self._emit( r , role , options)
|
|
117
|
+
return r
|
|
97
118
|
|
|
98
|
-
def internal_error(self , message=None , **kwargs ) :
|
|
119
|
+
def internal_error(self , message=None , alert=False, toast=False , options={} , **kwargs ) :
|
|
120
|
+
role = None
|
|
121
|
+
if alert :
|
|
122
|
+
role = 'alert'
|
|
123
|
+
elif toast :
|
|
124
|
+
role = 'toast'
|
|
99
125
|
timestamp = getTimestamp()
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
126
|
+
r = {'status' : 500 , 'message' : message , **kwargs , 'timestamp' : timestamp}
|
|
127
|
+
if role :
|
|
128
|
+
self._emit( r , role , options)
|
|
129
|
+
return r
|
|
130
|
+
|
|
131
|
+
def not_found(self , message=None , alert=False, toast=False , options={} , **kwargs) :
|
|
132
|
+
role = None
|
|
133
|
+
if alert :
|
|
134
|
+
role = 'alert'
|
|
135
|
+
elif toast :
|
|
136
|
+
role = 'toast'
|
|
103
137
|
timestamp = getTimestamp()
|
|
104
|
-
|
|
138
|
+
r = {'status' : 404 , 'message' : message , **kwargs , 'timestamp' : timestamp}
|
|
139
|
+
if role :
|
|
140
|
+
self._emit( r , role , options )
|
|
141
|
+
return r
|
|
105
142
|
|
|
106
|
-
def unauthorized(self , message=None , **kwargs) :
|
|
143
|
+
def unauthorized(self , message=None , alert=False, toast=False , options={} , **kwargs) :
|
|
144
|
+
role = None
|
|
145
|
+
if alert :
|
|
146
|
+
role = 'alert'
|
|
147
|
+
elif toast :
|
|
148
|
+
role = 'toast'
|
|
107
149
|
timestamp = getTimestamp()
|
|
108
|
-
|
|
150
|
+
r = {'status' : 401 , 'message' : message , **kwargs , 'timestamp' : timestamp}
|
|
151
|
+
if role :
|
|
152
|
+
self._emit( r , role , options)
|
|
153
|
+
return r
|
|
109
154
|
|
|
110
155
|
class AbortRequest :
|
|
111
156
|
def __init__(self, request ) :
|
|
@@ -203,6 +248,7 @@ class UISERVER :
|
|
|
203
248
|
self.logger = logger
|
|
204
249
|
self.stream = Stream()
|
|
205
250
|
self.simulate_network_delay = False
|
|
251
|
+
self.Response = Response(self.socketio , request )
|
|
206
252
|
if not self.logger :
|
|
207
253
|
self.logger = DEBUGGER(
|
|
208
254
|
name='easy_utils_dev_uiserver',
|
|
@@ -267,24 +313,24 @@ class UISERVER :
|
|
|
267
313
|
if not alive :
|
|
268
314
|
break
|
|
269
315
|
time.sleep(.25)
|
|
270
|
-
return Response
|
|
316
|
+
return self.Response.ok(message='Request aborted' , abort_timestamp=timestamp , abort_id=id , alive=alive , url=abort.request.get('path'))
|
|
271
317
|
|
|
272
318
|
else :
|
|
273
|
-
return Response
|
|
319
|
+
return self.Response.not_found(message='Request not found or request is not abortable. Check request headers for abortable flag.')
|
|
274
320
|
|
|
275
321
|
@self.app.route(f"/request/traceback/<key>" , methods=['GET'])
|
|
276
322
|
def get_traceback(key : str ) :
|
|
277
323
|
traceback = self.cache.get(key)
|
|
278
324
|
if traceback :
|
|
279
|
-
return Response
|
|
325
|
+
return self.Response.ok(message='Traceback found' , traceback=traceback.get('traceback'))
|
|
280
326
|
else :
|
|
281
|
-
return Response
|
|
327
|
+
return self.Response.not_found(message='Traceback not found or expired')
|
|
282
328
|
|
|
283
329
|
@self.app.route(f'{self.request_reply_base_url}/<id>' , methods=['GET'])
|
|
284
330
|
def get_result_of_async_request(id : str ) :
|
|
285
331
|
request : AbortRequest = self.bg_requests.get(id)
|
|
286
332
|
if request :
|
|
287
|
-
return Response
|
|
333
|
+
return self.Response.ok(
|
|
288
334
|
message='Result of async request found' ,
|
|
289
335
|
result=request.result ,
|
|
290
336
|
in_progress=request.in_progress ,
|
|
@@ -305,7 +351,7 @@ class UISERVER :
|
|
|
305
351
|
|
|
306
352
|
|
|
307
353
|
if (self.serve_with_secret_key) and (request.path not in self.secret_key_execlude_urls) and (request.headers.get('secretkey') != self.secretkey):
|
|
308
|
-
return Response
|
|
354
|
+
return self.Response.unauthorized(message='Secret key is invalid')
|
|
309
355
|
|
|
310
356
|
@copy_current_request_context
|
|
311
357
|
def run_async_job_results( target_func , abort : AbortRequest ) :
|
|
@@ -349,11 +395,11 @@ class UISERVER :
|
|
|
349
395
|
if request.headers.get('async') == 'false' :
|
|
350
396
|
target_func = current_app.view_functions.get(request.endpoint)
|
|
351
397
|
if not target_func:
|
|
352
|
-
return Response
|
|
398
|
+
return self.Response.not_found(message='Route not found')
|
|
353
399
|
th = start_thread(target=run_async_job_results, args=[target_func , abort ])
|
|
354
400
|
abort.thread = th
|
|
355
401
|
self.bg_requests[requestId] = abort
|
|
356
|
-
return Response
|
|
402
|
+
return self.Response.ok(message='Request now in running bg' , abort_id=abort.abort_id)
|
|
357
403
|
|
|
358
404
|
if self.return_exception_as_code_400 :
|
|
359
405
|
@self.app.errorhandler(Exception)
|
|
@@ -392,7 +438,7 @@ class UISERVER :
|
|
|
392
438
|
}
|
|
393
439
|
self.logger.error(f'error: {json.dumps(response , indent=4)}')
|
|
394
440
|
self.cache.set( custom_key=key , item={**response , 'traceback' : str(traceback.format_exc())} , auto_destroy_period=1800 , store_deleted_key=False )
|
|
395
|
-
return Response
|
|
441
|
+
return self.Response.error( **response )
|
|
396
442
|
|
|
397
443
|
@self.app.after_request
|
|
398
444
|
def after_request(response) :
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|