meerschaum 2.4.0.dev1__py3-none-any.whl → 2.4.0rc2__py3-none-any.whl
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.
- meerschaum/_internal/arguments/_parse_arguments.py +2 -5
- meerschaum/_internal/docs/index.py +3 -2
- meerschaum/_internal/entry.py +13 -7
- meerschaum/_internal/shell/Shell.py +38 -44
- meerschaum/_internal/term/TermPageHandler.py +2 -3
- meerschaum/_internal/term/__init__.py +13 -11
- meerschaum/actions/api.py +10 -7
- meerschaum/actions/bootstrap.py +2 -1
- meerschaum/actions/delete.py +4 -1
- meerschaum/actions/register.py +1 -3
- meerschaum/actions/stack.py +24 -19
- meerschaum/actions/start.py +25 -26
- meerschaum/actions/sync.py +53 -52
- meerschaum/api/__init__.py +48 -14
- meerschaum/api/_events.py +15 -10
- meerschaum/api/_oauth2.py +2 -2
- meerschaum/api/_websockets.py +5 -4
- meerschaum/api/dash/__init__.py +1 -11
- meerschaum/api/dash/callbacks/dashboard.py +47 -55
- meerschaum/api/dash/callbacks/jobs.py +15 -16
- meerschaum/api/dash/callbacks/login.py +16 -10
- meerschaum/api/dash/callbacks/pipes.py +3 -4
- meerschaum/api/dash/callbacks/plugins.py +1 -1
- meerschaum/api/dash/callbacks/register.py +15 -11
- meerschaum/api/dash/components.py +54 -59
- meerschaum/api/dash/jobs.py +5 -9
- meerschaum/api/dash/pages/pipes.py +4 -1
- meerschaum/api/dash/pipes.py +13 -17
- meerschaum/api/dash/plugins.py +6 -4
- meerschaum/api/dash/sessions.py +176 -0
- meerschaum/api/dash/users.py +2 -53
- meerschaum/api/dash/webterm.py +12 -17
- meerschaum/api/resources/static/js/terminado.js +1 -1
- meerschaum/api/routes/_actions.py +4 -20
- meerschaum/api/routes/_jobs.py +8 -7
- meerschaum/api/routes/_webterm.py +5 -6
- meerschaum/config/_default.py +6 -1
- meerschaum/config/_version.py +1 -1
- meerschaum/config/stack/__init__.py +9 -7
- meerschaum/config/static/__init__.py +4 -0
- meerschaum/connectors/__init__.py +15 -9
- meerschaum/connectors/api/{APIConnector.py → _APIConnector.py} +3 -1
- meerschaum/connectors/api/__init__.py +2 -1
- meerschaum/connectors/parse.py +18 -16
- meerschaum/connectors/sql/__init__.py +3 -1
- meerschaum/connectors/sql/_pipes.py +39 -39
- meerschaum/connectors/valkey/{ValkeyConnector.py → _ValkeyConnector.py} +5 -5
- meerschaum/connectors/valkey/__init__.py +3 -1
- meerschaum/connectors/valkey/_pipes.py +13 -8
- meerschaum/core/Pipe/_data.py +155 -100
- meerschaum/jobs/_Job.py +1 -6
- meerschaum/jobs/__init__.py +7 -2
- meerschaum/utils/dataframe.py +4 -1
- meerschaum/utils/formatting/_shell.py +5 -6
- meerschaum/utils/packages/__init__.py +14 -9
- {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/METADATA +1 -1
- {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/RECORD +65 -65
- {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/WHEEL +1 -1
- meerschaum/api/dash/actions.py +0 -255
- /meerschaum/connectors/{Connector.py → _Connector.py} +0 -0
- /meerschaum/connectors/sql/{SQLConnector.py → _SQLConnector.py} +0 -0
- {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/LICENSE +0 -0
- {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/NOTICE +0 -0
- {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/entry_points.txt +0 -0
- {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/top_level.txt +0 -0
- {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/zip-safe +0 -0
meerschaum/actions/start.py
CHANGED
@@ -304,24 +304,20 @@ def _start_jobs(
|
|
304
304
|
|
305
305
|
|
306
306
|
def _start_gui(
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
307
|
+
action: Optional[List[str]] = None,
|
308
|
+
mrsm_instance: Optional[str] = None,
|
309
|
+
port: Optional[int] = None,
|
310
|
+
debug: bool = False,
|
311
|
+
**kw
|
312
|
+
) -> SuccessTuple:
|
313
313
|
"""
|
314
314
|
Start the Meerschaum GUI application.
|
315
315
|
"""
|
316
|
-
from meerschaum.utils.daemon import Daemon
|
317
|
-
from meerschaum.utils.process import run_process
|
318
316
|
from meerschaum.utils.venv import venv_exec
|
319
|
-
from meerschaum.utils.packages import
|
320
|
-
run_python_package, attempt_import, venv_contains_package, pip_install
|
321
|
-
)
|
317
|
+
from meerschaum.utils.packages import attempt_import
|
322
318
|
from meerschaum.utils.warnings import warn
|
323
319
|
from meerschaum.utils.debug import dprint
|
324
|
-
from meerschaum.utils.networking import find_open_ports
|
320
|
+
from meerschaum.utils.networking import find_open_ports
|
325
321
|
from meerschaum.connectors.parse import parse_instance_keys
|
326
322
|
from meerschaum._internal.term.tools import is_webterm_running
|
327
323
|
import platform
|
@@ -395,13 +391,14 @@ def _start_gui(
|
|
395
391
|
|
396
392
|
|
397
393
|
def _start_webterm(
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
394
|
+
port: Optional[int] = None,
|
395
|
+
host: Optional[str] = None,
|
396
|
+
mrsm_instance: Optional[str] = None,
|
397
|
+
force: bool = False,
|
398
|
+
nopretty: bool = False,
|
399
|
+
sysargs: Optional[List[str]] = None,
|
400
|
+
**kw
|
401
|
+
) -> SuccessTuple:
|
405
402
|
"""
|
406
403
|
Start the Meerschaum Web Terminal.
|
407
404
|
|
@@ -409,15 +406,17 @@ def _start_webterm(
|
|
409
406
|
- `-p`, `--port`
|
410
407
|
The port to which the webterm binds.
|
411
408
|
Defaults to 8765, and `--force` will choose the next available port.
|
412
|
-
|
409
|
+
|
413
410
|
- `--host`
|
414
411
|
The host interface to which the webterm binds.
|
415
412
|
Defaults to '127.0.0.1'.
|
413
|
+
|
414
|
+
- `-i`, '--instance'
|
415
|
+
The default instance to use for the Webterm shell.
|
416
416
|
"""
|
417
|
-
from meerschaum._internal.term import get_webterm_app_and_manager,
|
417
|
+
from meerschaum._internal.term import get_webterm_app_and_manager, tornado_ioloop
|
418
418
|
from meerschaum._internal.term.tools import is_webterm_running
|
419
|
-
from meerschaum.utils.networking import find_open_ports
|
420
|
-
from meerschaum.utils.packages import attempt_import
|
419
|
+
from meerschaum.utils.networking import find_open_ports
|
421
420
|
from meerschaum.utils.warnings import info
|
422
421
|
|
423
422
|
if host is None:
|
@@ -426,7 +425,7 @@ def _start_webterm(
|
|
426
425
|
port = 8765
|
427
426
|
if sysargs is None:
|
428
427
|
sysargs = ['start', 'webterm']
|
429
|
-
tornado_app, term_manager = get_webterm_app_and_manager()
|
428
|
+
tornado_app, term_manager = get_webterm_app_and_manager(instance_keys=mrsm_instance)
|
430
429
|
|
431
430
|
if is_webterm_running(host, port):
|
432
431
|
if force:
|
@@ -517,12 +516,12 @@ def _start_connectors(
|
|
517
516
|
|
518
517
|
success = len(fails) == 0
|
519
518
|
msg = (
|
520
|
-
|
519
|
+
"Successfully started connector" + ('s' if len(successes) != 1 else '')
|
521
520
|
+ ' ' + items_str(successes) + '.'
|
522
521
|
) if success else f"Failed to start {len(fails)} connectors."
|
523
522
|
if len(fails) > 0:
|
524
523
|
msg += (
|
525
|
-
|
524
|
+
"\n Failed to start connector" + ('s' if len(fails) != 1 else '')
|
526
525
|
+ ' ' + items_str(fails) + '.'
|
527
526
|
)
|
528
527
|
|
meerschaum/actions/sync.py
CHANGED
@@ -9,10 +9,12 @@ NOTE: `sync` required a SQL connection and is not intended for client use
|
|
9
9
|
"""
|
10
10
|
|
11
11
|
from __future__ import annotations
|
12
|
-
from datetime import timedelta
|
12
|
+
from datetime import timedelta
|
13
|
+
|
13
14
|
import meerschaum as mrsm
|
14
15
|
from meerschaum.utils.typing import SuccessTuple, Any, List, Optional, Tuple, Union
|
15
16
|
|
17
|
+
|
16
18
|
def sync(
|
17
19
|
action: Optional[List[str]] = None,
|
18
20
|
**kw: Any
|
@@ -38,47 +40,45 @@ def sync(
|
|
38
40
|
|
39
41
|
|
40
42
|
def _pipes_lap(
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
43
|
+
workers: Optional[int] = None,
|
44
|
+
debug: Optional[bool] = None,
|
45
|
+
unblock: bool = False,
|
46
|
+
force: bool = False,
|
47
|
+
min_seconds: int = 1,
|
48
|
+
verify: bool = False,
|
49
|
+
deduplicate: bool = False,
|
50
|
+
bounded: Optional[bool] = None,
|
51
|
+
chunk_interval: Union[timedelta, int, None] = None,
|
52
|
+
mrsm_instance: Optional[str] = None,
|
53
|
+
timeout_seconds: Optional[int] = None,
|
54
|
+
nopretty: bool = False,
|
55
|
+
_progress: Optional['rich.progress.Progress'] = None,
|
56
|
+
**kw: Any
|
57
|
+
) -> Tuple[List[mrsm.Pipe], List[mrsm.Pipe]]:
|
56
58
|
"""
|
57
59
|
Do a lap of syncing pipes.
|
58
60
|
"""
|
61
|
+
import queue
|
62
|
+
import multiprocessing
|
63
|
+
import time
|
64
|
+
import copy
|
65
|
+
import json
|
66
|
+
import sys
|
67
|
+
|
59
68
|
from meerschaum import get_pipes
|
60
69
|
from meerschaum.utils.debug import dprint, _checkpoint
|
61
|
-
from meerschaum.utils.packages import attempt_import
|
62
|
-
from meerschaum.utils.formatting import print_tuple
|
70
|
+
from meerschaum.utils.packages import attempt_import
|
71
|
+
from meerschaum.utils.formatting import print_tuple
|
63
72
|
from meerschaum.utils.warnings import warn
|
64
|
-
from meerschaum.utils.threading import Lock,
|
65
|
-
from meerschaum.utils.misc import print_options, get_cols_lines
|
66
|
-
from meerschaum.utils.pool import get_pool_executor, get_pool
|
73
|
+
from meerschaum.utils.threading import Lock, Thread, Event
|
67
74
|
from meerschaum.connectors.parse import parse_instance_keys
|
68
|
-
from meerschaum import Plugin
|
69
|
-
import queue
|
70
|
-
import multiprocessing
|
71
|
-
import contextlib
|
72
|
-
import time, os, copy
|
73
75
|
from meerschaum.utils.packages import venv_exec
|
74
76
|
from meerschaum.utils.process import poll_process
|
75
|
-
import json
|
76
|
-
import sys
|
77
77
|
dill = attempt_import('dill')
|
78
78
|
|
79
79
|
rich_table, rich_text, rich_box = attempt_import(
|
80
80
|
'rich.table', 'rich.text', 'rich.box',
|
81
|
-
lazy
|
81
|
+
lazy=False,
|
82
82
|
)
|
83
83
|
all_kw = copy.deepcopy(kw)
|
84
84
|
all_kw.update({
|
@@ -126,7 +126,7 @@ def _pipes_lap(
|
|
126
126
|
+ "may lead to concurrency issues.\n You can change the pool size with "
|
127
127
|
+ "`edit config system` under the keys connectors:sql:create_engine:pool_size,\n "
|
128
128
|
+ "and a size of 0 will not limit the number of connections.",
|
129
|
-
stack
|
129
|
+
stack=False,
|
130
130
|
)
|
131
131
|
|
132
132
|
|
@@ -155,8 +155,8 @@ def _pipes_lap(
|
|
155
155
|
) + msg + '\n'
|
156
156
|
print_tuple(
|
157
157
|
(success, msg),
|
158
|
-
calm
|
159
|
-
_progress
|
158
|
+
calm=True,
|
159
|
+
_progress=_progress,
|
160
160
|
)
|
161
161
|
_checkpoint(_progress=_progress, _task=_task)
|
162
162
|
if _progress is not None:
|
@@ -274,25 +274,26 @@ def _sync_pipes(
|
|
274
274
|
- `--debug`
|
275
275
|
- Print verbose messages.
|
276
276
|
"""
|
277
|
-
|
277
|
+
import time
|
278
|
+
import os
|
279
|
+
import contextlib
|
280
|
+
|
278
281
|
from meerschaum.utils.warnings import warn, info
|
279
|
-
from meerschaum.utils.formatting import
|
280
|
-
from meerschaum.utils.formatting._shell import
|
281
|
-
from meerschaum.utils.formatting._shell import clear_screen, flush_with_newlines
|
282
|
+
from meerschaum.utils.formatting._shell import progress
|
283
|
+
from meerschaum.utils.formatting._shell import clear_screen
|
282
284
|
from meerschaum.utils.formatting import print_pipes_results
|
283
|
-
import
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
285
|
+
from meerschaum.config.static import STATIC_CONFIG
|
286
|
+
|
287
|
+
noninteractive_val = os.environ.get(STATIC_CONFIG['environment']['noninteractive'], None)
|
288
|
+
is_noninterative = noninteractive_val in ('1', 'true', 'True', 'yes')
|
289
|
+
|
288
290
|
run = True
|
289
291
|
msg = ""
|
290
292
|
interrupt_warning_msg = "Syncing was interrupted due to a keyboard interrupt."
|
291
293
|
cooldown = 2 * (min_seconds + 1)
|
292
|
-
underline = '\u2015' if UNICODE else '-'
|
293
294
|
success_pipes, failure_pipes = [], []
|
294
295
|
while run:
|
295
|
-
_progress = progress() if shell else None
|
296
|
+
_progress = progress() if shell and not is_noninterative else None
|
296
297
|
cm = _progress if _progress is not None else contextlib.nullcontext()
|
297
298
|
|
298
299
|
lap_begin = time.perf_counter()
|
@@ -301,15 +302,15 @@ def _sync_pipes(
|
|
301
302
|
results_dict = {}
|
302
303
|
with cm:
|
303
304
|
results_dict = _pipes_lap(
|
304
|
-
min_seconds
|
305
|
-
_progress
|
306
|
-
verify
|
307
|
-
deduplicate
|
308
|
-
bounded
|
309
|
-
chunk_interval
|
310
|
-
unblock
|
311
|
-
debug
|
312
|
-
nopretty
|
305
|
+
min_seconds=min_seconds,
|
306
|
+
_progress=_progress,
|
307
|
+
verify=verify,
|
308
|
+
deduplicate=deduplicate,
|
309
|
+
bounded=bounded,
|
310
|
+
chunk_interval=chunk_interval,
|
311
|
+
unblock=unblock,
|
312
|
+
debug=debug,
|
313
|
+
nopretty=nopretty,
|
313
314
|
**kw
|
314
315
|
)
|
315
316
|
success_pipes = [
|
meerschaum/api/__init__.py
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
Meerschaum API backend. Start an API instance with `start api`.
|
7
7
|
"""
|
8
8
|
from __future__ import annotations
|
9
|
-
import
|
9
|
+
import os
|
10
10
|
from meerschaum.utils.typing import Dict, Any, Optional
|
11
11
|
|
12
12
|
from meerschaum import __version__ as version
|
@@ -21,7 +21,7 @@ from meerschaum.utils.packages import attempt_import
|
|
21
21
|
from meerschaum.utils import get_pipes as _get_pipes
|
22
22
|
from meerschaum.config._paths import API_UVICORN_CONFIG_PATH, API_UVICORN_RESOURCES_PATH
|
23
23
|
from meerschaum.plugins import _api_plugins
|
24
|
-
from meerschaum.utils.warnings import warn
|
24
|
+
from meerschaum.utils.warnings import warn, dprint
|
25
25
|
from meerschaum.utils.threading import RLock
|
26
26
|
|
27
27
|
_locks = {'pipes': RLock(), 'connector': RLock(), 'uvicorn_config': RLock()}
|
@@ -44,8 +44,8 @@ uv = attempt_import('uv', lazy=False, check_update=CHECK_UPDATE)
|
|
44
44
|
'starlette.responses',
|
45
45
|
'multipart',
|
46
46
|
'packaging.version',
|
47
|
-
lazy
|
48
|
-
check_update
|
47
|
+
lazy=False,
|
48
|
+
check_update=CHECK_UPDATE,
|
49
49
|
)
|
50
50
|
(
|
51
51
|
typing_extensions,
|
@@ -53,9 +53,9 @@ uv = attempt_import('uv', lazy=False, check_update=CHECK_UPDATE)
|
|
53
53
|
) = attempt_import(
|
54
54
|
'typing_extensions',
|
55
55
|
'uvicorn.workers',
|
56
|
-
lazy
|
57
|
-
check_update
|
58
|
-
venv
|
56
|
+
lazy=False,
|
57
|
+
check_update=CHECK_UPDATE,
|
58
|
+
venv=None,
|
59
59
|
)
|
60
60
|
from meerschaum.api._chain import check_allow_chaining, DISALLOW_CHAINING_MESSAGE
|
61
61
|
uvicorn_config_path = API_UVICORN_RESOURCES_PATH / SERVER_ID / 'config.json'
|
@@ -75,7 +75,7 @@ def get_uvicorn_config() -> Dict[str, Any]:
|
|
75
75
|
with _locks['uvicorn_config']:
|
76
76
|
if uvicorn_config is None:
|
77
77
|
try:
|
78
|
-
with open(uvicorn_config_path, 'r') as f:
|
78
|
+
with open(uvicorn_config_path, 'r', encoding='utf-8') as f:
|
79
79
|
uvicorn_config = json.load(f)
|
80
80
|
_uvicorn_config = uvicorn_config
|
81
81
|
except Exception as e:
|
@@ -93,12 +93,12 @@ debug = get_uvicorn_config().get('debug', False)
|
|
93
93
|
no_dash = get_uvicorn_config().get('no_dash', False)
|
94
94
|
no_auth = get_uvicorn_config().get('no_auth', False)
|
95
95
|
private = get_uvicorn_config().get('private', False)
|
96
|
+
production = get_uvicorn_config().get('production', False)
|
96
97
|
_include_dash = (not no_dash)
|
97
98
|
|
98
99
|
connector = None
|
99
100
|
def get_api_connector(instance_keys: Optional[str] = None):
|
100
101
|
"""Create the instance connector."""
|
101
|
-
from meerschaum.utils.debug import dprint
|
102
102
|
global connector
|
103
103
|
with _locks['connector']:
|
104
104
|
if connector is None:
|
@@ -111,6 +111,40 @@ def get_api_connector(instance_keys: Optional[str] = None):
|
|
111
111
|
dprint(f"API instance connector: {connector}")
|
112
112
|
return connector
|
113
113
|
|
114
|
+
cache_connector = None
|
115
|
+
def get_cache_connector(connector_keys: Optional[str] = None):
|
116
|
+
"""Return the `valkey` connector if running in production."""
|
117
|
+
global cache_connector
|
118
|
+
if cache_connector is not None:
|
119
|
+
return cache_connector
|
120
|
+
|
121
|
+
if not production:
|
122
|
+
return None
|
123
|
+
|
124
|
+
enable_valkey_cache = get_config('system', 'experimental', 'valkey_session_cache')
|
125
|
+
if not enable_valkey_cache:
|
126
|
+
return None
|
127
|
+
|
128
|
+
connector_keys = connector_keys or get_config(
|
129
|
+
'system', 'api', 'cache', 'connector',
|
130
|
+
warn=False,
|
131
|
+
)
|
132
|
+
if connector_keys is None:
|
133
|
+
return None
|
134
|
+
|
135
|
+
if not connector_keys.startswith('valkey'):
|
136
|
+
warn(f"Invalid cache connector '{connector_keys}'.")
|
137
|
+
return None
|
138
|
+
|
139
|
+
if cache_connector is None:
|
140
|
+
from meerschaum.connectors.parse import parse_instance_keys
|
141
|
+
cache_connector = parse_instance_keys(connector_keys)
|
142
|
+
|
143
|
+
if debug:
|
144
|
+
dprint(f"Cache connector: {cache_connector}")
|
145
|
+
|
146
|
+
return cache_connector
|
147
|
+
|
114
148
|
|
115
149
|
_pipes = None
|
116
150
|
def pipes(refresh=False):
|
@@ -138,17 +172,17 @@ def get_pipe(connector_keys, metric_key, location_key, refresh=False):
|
|
138
172
|
|
139
173
|
app = fastapi.FastAPI(
|
140
174
|
title = 'Meerschaum API',
|
141
|
-
description
|
142
|
-
version
|
143
|
-
contact
|
175
|
+
description=__doc__,
|
176
|
+
version=__version__,
|
177
|
+
contact={
|
144
178
|
'name': 'Bennett Meares',
|
145
179
|
'url': 'https://meerschaum.io',
|
146
180
|
},
|
147
|
-
license_info
|
181
|
+
license_info={
|
148
182
|
'name': 'Apache 2.0',
|
149
183
|
'url': 'https://www.apache.org/licenses/LICENSE-2.0.html',
|
150
184
|
},
|
151
|
-
open_api_tags
|
185
|
+
open_api_tags=[
|
152
186
|
{
|
153
187
|
'name': 'Pipes',
|
154
188
|
'description': 'Access pipes by indexing their keys.',
|
meerschaum/api/_events.py
CHANGED
@@ -6,29 +6,30 @@
|
|
6
6
|
Declare FastAPI events in this module (startup, shutdown, etc.).
|
7
7
|
"""
|
8
8
|
|
9
|
-
import sys
|
9
|
+
import sys
|
10
|
+
import os
|
11
|
+
import time
|
10
12
|
from meerschaum.api import (
|
11
13
|
app,
|
12
14
|
get_api_connector,
|
15
|
+
get_cache_connector,
|
13
16
|
get_uvicorn_config,
|
14
17
|
debug,
|
15
18
|
no_dash,
|
16
|
-
uvicorn_config_path,
|
17
19
|
)
|
18
20
|
from meerschaum.utils.debug import dprint
|
19
21
|
from meerschaum.connectors.poll import retry_connect
|
20
22
|
from meerschaum.utils.warnings import warn
|
21
|
-
from meerschaum._internal.term.tools import is_webterm_running
|
22
23
|
from meerschaum.jobs import (
|
23
24
|
get_jobs,
|
24
25
|
start_check_jobs_thread,
|
25
26
|
stop_check_jobs_thread,
|
26
|
-
get_executor_keys_from_context,
|
27
27
|
)
|
28
28
|
from meerschaum.config.static import STATIC_CONFIG
|
29
29
|
|
30
30
|
TEMP_PREFIX: str = STATIC_CONFIG['api']['jobs']['temp_prefix']
|
31
31
|
|
32
|
+
|
32
33
|
@app.on_event("startup")
|
33
34
|
async def startup():
|
34
35
|
"""
|
@@ -41,10 +42,17 @@ async def startup():
|
|
41
42
|
|
42
43
|
connected = retry_connect(
|
43
44
|
get_api_connector(),
|
44
|
-
workers
|
45
|
-
debug
|
45
|
+
workers=get_uvicorn_config().get('workers', None),
|
46
|
+
debug=debug
|
46
47
|
)
|
47
|
-
|
48
|
+
cache_connector = get_cache_connector()
|
49
|
+
if cache_connector is not None:
|
50
|
+
connected = retry_connect(
|
51
|
+
cache_connector,
|
52
|
+
workers=get_uvicorn_config().get('workers', None),
|
53
|
+
debug=debug,
|
54
|
+
)
|
55
|
+
except Exception:
|
48
56
|
import traceback
|
49
57
|
traceback.print_exc()
|
50
58
|
connected = False
|
@@ -78,8 +86,5 @@ async def shutdown():
|
|
78
86
|
|
79
87
|
### Terminate any running jobs left over.
|
80
88
|
if 'meerschaum.api.dash' in sys.modules:
|
81
|
-
from meerschaum.api.dash.actions import running_jobs, stop_action
|
82
89
|
from meerschaum.api.dash.webterm import stop_webterm
|
83
90
|
stop_webterm()
|
84
|
-
for session_id in running_jobs:
|
85
|
-
stop_action({'session-store.data': {'session-id': session_id}})
|
meerschaum/api/_oauth2.py
CHANGED
@@ -39,10 +39,10 @@ def generate_secret_key() -> str:
|
|
39
39
|
from meerschaum.config._paths import API_SECRET_KEY_PATH
|
40
40
|
if not API_SECRET_KEY_PATH.exists():
|
41
41
|
secret_key = os.urandom(24).hex()
|
42
|
-
with open(API_SECRET_KEY_PATH, 'w+') as f:
|
42
|
+
with open(API_SECRET_KEY_PATH, 'w+', encoding='utf-8') as f:
|
43
43
|
f.write(secret_key)
|
44
44
|
else:
|
45
|
-
with open(API_SECRET_KEY_PATH, 'r') as f:
|
45
|
+
with open(API_SECRET_KEY_PATH, 'r', encoding='utf-8') as f:
|
46
46
|
secret_key = f.read()
|
47
47
|
|
48
48
|
return secret_key.encode('utf-8')
|
meerschaum/api/_websockets.py
CHANGED
@@ -6,13 +6,13 @@
|
|
6
6
|
Implement WebSockets for the Meerschaum API via FastAPI.
|
7
7
|
"""
|
8
8
|
|
9
|
-
import time, uuid
|
10
9
|
from datetime import datetime, timezone
|
10
|
+
|
11
11
|
from meerschaum.api import (
|
12
|
-
app,
|
12
|
+
app,
|
13
|
+
fastapi,
|
14
|
+
endpoints,
|
13
15
|
)
|
14
|
-
from meerschaum.api.dash.users import is_session_authenticated
|
15
|
-
from meerschaum.utils.typing import Optional
|
16
16
|
|
17
17
|
_websocket_endpoint = endpoints['websocket']
|
18
18
|
|
@@ -28,6 +28,7 @@ async def websocket_endpoint(
|
|
28
28
|
"""
|
29
29
|
Communicate with the Web Interface over a websocket.
|
30
30
|
"""
|
31
|
+
from meerschaum.api.dash.sessions import is_session_authenticated
|
31
32
|
await websocket.accept()
|
32
33
|
try:
|
33
34
|
initial_data = await websocket.receive_json()
|
meerschaum/api/dash/__init__.py
CHANGED
@@ -16,7 +16,6 @@ flask_compress = attempt_import('flask_compress', lazy=False)
|
|
16
16
|
_monkey_patch_get_distribution('flask-compress', flask_compress.__version__)
|
17
17
|
dash = attempt_import('dash', lazy=False)
|
18
18
|
|
19
|
-
|
20
19
|
from meerschaum.utils.typing import List, Optional
|
21
20
|
from meerschaum.config.static import _static_config
|
22
21
|
from meerschaum.api import (
|
@@ -38,19 +37,10 @@ with warnings.catch_warnings():
|
|
38
37
|
html, dcc = import_html(), import_dcc()
|
39
38
|
from meerschaum.api.dash.components import location
|
40
39
|
|
41
|
-
active_sessions = {}
|
42
|
-
authenticated_sessions = {}
|
43
|
-
unauthenticated_sessions = {}
|
44
|
-
running_jobs = {}
|
45
|
-
running_monitors = {}
|
46
|
-
stopped_jobs = {}
|
47
|
-
stopped_monitors = {}
|
48
|
-
|
49
40
|
stylesheets = [
|
50
41
|
'/static/css/bootstrap.min.css',
|
51
42
|
'/static/css/dbc_dark.css',
|
52
43
|
'/static/css/dash.css',
|
53
|
-
'/static/css/bootstrap-icons/font/bootstrap-icons.min.css',
|
54
44
|
]
|
55
45
|
scripts = ['/static/js/node_modules/xterm/lib/xterm.js']
|
56
46
|
dash_app = enrich.DashProxy(
|
@@ -68,7 +58,7 @@ dash_app = enrich.DashProxy(
|
|
68
58
|
|
69
59
|
dash_app.layout = html.Div([
|
70
60
|
location,
|
71
|
-
dcc.Store(id='session-store', storage_type='
|
61
|
+
dcc.Store(id='session-store', storage_type='local', data={}),
|
72
62
|
html.Div([], id='page-layout-div'),
|
73
63
|
])
|
74
64
|
|