meerschaum 2.9.4__py3-none-any.whl → 3.0.0__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/__init__.py +5 -2
- meerschaum/_internal/__init__.py +1 -0
- meerschaum/_internal/arguments/_parse_arguments.py +4 -4
- meerschaum/_internal/arguments/_parser.py +33 -4
- meerschaum/_internal/cli/__init__.py +6 -0
- meerschaum/_internal/cli/daemons.py +103 -0
- meerschaum/_internal/cli/entry.py +220 -0
- meerschaum/_internal/cli/workers.py +435 -0
- meerschaum/_internal/docs/index.py +48 -2
- meerschaum/_internal/entry.py +50 -14
- meerschaum/_internal/shell/Shell.py +121 -29
- meerschaum/_internal/shell/__init__.py +4 -1
- meerschaum/_internal/static.py +359 -0
- meerschaum/_internal/term/TermPageHandler.py +1 -2
- meerschaum/_internal/term/__init__.py +40 -6
- meerschaum/_internal/term/tools.py +33 -8
- meerschaum/actions/__init__.py +6 -4
- meerschaum/actions/api.py +53 -13
- meerschaum/actions/attach.py +1 -0
- meerschaum/actions/bootstrap.py +8 -8
- meerschaum/actions/delete.py +4 -2
- meerschaum/actions/edit.py +171 -25
- meerschaum/actions/login.py +8 -8
- meerschaum/actions/register.py +143 -6
- meerschaum/actions/reload.py +22 -5
- meerschaum/actions/restart.py +14 -0
- meerschaum/actions/show.py +184 -31
- meerschaum/actions/start.py +166 -17
- meerschaum/actions/stop.py +38 -2
- meerschaum/actions/sync.py +7 -2
- meerschaum/actions/tag.py +9 -8
- meerschaum/actions/verify.py +5 -8
- meerschaum/api/__init__.py +45 -15
- meerschaum/api/_events.py +46 -4
- meerschaum/api/_oauth2.py +162 -9
- meerschaum/api/_tokens.py +102 -0
- meerschaum/api/dash/__init__.py +0 -3
- meerschaum/api/dash/callbacks/__init__.py +1 -0
- meerschaum/api/dash/callbacks/custom.py +4 -3
- meerschaum/api/dash/callbacks/dashboard.py +228 -117
- meerschaum/api/dash/callbacks/jobs.py +14 -7
- meerschaum/api/dash/callbacks/login.py +10 -1
- meerschaum/api/dash/callbacks/pipes.py +194 -14
- meerschaum/api/dash/callbacks/plugins.py +0 -1
- meerschaum/api/dash/callbacks/register.py +10 -3
- meerschaum/api/dash/callbacks/settings/password_reset.py +2 -2
- meerschaum/api/dash/callbacks/tokens.py +389 -0
- meerschaum/api/dash/components.py +36 -15
- meerschaum/api/dash/jobs.py +1 -1
- meerschaum/api/dash/keys.py +35 -93
- meerschaum/api/dash/pages/__init__.py +2 -1
- meerschaum/api/dash/pages/dashboard.py +1 -20
- meerschaum/api/dash/pages/{job.py → jobs.py} +10 -7
- meerschaum/api/dash/pages/login.py +2 -2
- meerschaum/api/dash/pages/pipes.py +16 -5
- meerschaum/api/dash/pages/settings/password_reset.py +1 -1
- meerschaum/api/dash/pages/tokens.py +53 -0
- meerschaum/api/dash/pipes.py +438 -88
- meerschaum/api/dash/sessions.py +12 -0
- meerschaum/api/dash/tokens.py +603 -0
- meerschaum/api/dash/websockets.py +1 -1
- meerschaum/api/dash/webterm.py +18 -6
- meerschaum/api/models/__init__.py +23 -3
- meerschaum/api/models/_actions.py +22 -0
- meerschaum/api/models/_pipes.py +91 -7
- meerschaum/api/models/_tokens.py +81 -0
- meerschaum/api/resources/static/css/dash.css +16 -0
- meerschaum/api/resources/static/js/terminado.js +3 -0
- meerschaum/api/resources/static/js/xterm-addon-unicode11.js +2 -0
- meerschaum/api/resources/templates/termpage.html +13 -0
- meerschaum/api/routes/__init__.py +1 -0
- meerschaum/api/routes/_actions.py +3 -4
- meerschaum/api/routes/_connectors.py +3 -7
- meerschaum/api/routes/_jobs.py +26 -35
- meerschaum/api/routes/_login.py +120 -15
- meerschaum/api/routes/_misc.py +5 -10
- meerschaum/api/routes/_pipes.py +178 -143
- meerschaum/api/routes/_plugins.py +38 -28
- meerschaum/api/routes/_tokens.py +236 -0
- meerschaum/api/routes/_users.py +47 -35
- meerschaum/api/routes/_version.py +3 -3
- meerschaum/api/routes/_webterm.py +3 -3
- meerschaum/config/__init__.py +100 -30
- meerschaum/config/_default.py +132 -64
- meerschaum/config/_edit.py +38 -32
- meerschaum/config/_formatting.py +2 -0
- meerschaum/config/_patch.py +10 -8
- meerschaum/config/_paths.py +133 -13
- meerschaum/config/_read_config.py +87 -36
- meerschaum/config/_sync.py +6 -3
- meerschaum/config/_version.py +1 -1
- meerschaum/config/environment.py +262 -0
- meerschaum/config/stack/__init__.py +37 -15
- meerschaum/config/static.py +18 -0
- meerschaum/connectors/_Connector.py +11 -6
- meerschaum/connectors/__init__.py +41 -22
- meerschaum/connectors/api/_APIConnector.py +34 -6
- meerschaum/connectors/api/_actions.py +2 -2
- meerschaum/connectors/api/_jobs.py +12 -1
- meerschaum/connectors/api/_login.py +33 -7
- meerschaum/connectors/api/_misc.py +2 -2
- meerschaum/connectors/api/_pipes.py +23 -32
- meerschaum/connectors/api/_plugins.py +2 -2
- meerschaum/connectors/api/_request.py +1 -1
- meerschaum/connectors/api/_tokens.py +146 -0
- meerschaum/connectors/api/_users.py +70 -58
- meerschaum/connectors/instance/_InstanceConnector.py +83 -0
- meerschaum/connectors/instance/__init__.py +10 -0
- meerschaum/connectors/instance/_pipes.py +442 -0
- meerschaum/connectors/instance/_plugins.py +159 -0
- meerschaum/connectors/instance/_tokens.py +317 -0
- meerschaum/connectors/instance/_users.py +188 -0
- meerschaum/connectors/parse.py +5 -2
- meerschaum/connectors/sql/_SQLConnector.py +22 -5
- meerschaum/connectors/sql/_cli.py +12 -11
- meerschaum/connectors/sql/_create_engine.py +12 -168
- meerschaum/connectors/sql/_fetch.py +2 -18
- meerschaum/connectors/sql/_pipes.py +295 -278
- meerschaum/connectors/sql/_plugins.py +29 -0
- meerschaum/connectors/sql/_sql.py +47 -22
- meerschaum/connectors/sql/_users.py +36 -2
- meerschaum/connectors/sql/tables/__init__.py +254 -122
- meerschaum/connectors/valkey/_ValkeyConnector.py +5 -7
- meerschaum/connectors/valkey/_pipes.py +60 -31
- meerschaum/connectors/valkey/_plugins.py +2 -26
- meerschaum/core/Pipe/__init__.py +115 -85
- meerschaum/core/Pipe/_attributes.py +425 -124
- meerschaum/core/Pipe/_bootstrap.py +54 -24
- meerschaum/core/Pipe/_cache.py +555 -0
- meerschaum/core/Pipe/_clear.py +0 -11
- meerschaum/core/Pipe/_data.py +96 -68
- meerschaum/core/Pipe/_deduplicate.py +0 -13
- meerschaum/core/Pipe/_delete.py +12 -21
- meerschaum/core/Pipe/_drop.py +11 -23
- meerschaum/core/Pipe/_dtypes.py +49 -19
- meerschaum/core/Pipe/_edit.py +14 -4
- meerschaum/core/Pipe/_fetch.py +1 -1
- meerschaum/core/Pipe/_index.py +8 -14
- meerschaum/core/Pipe/_show.py +5 -5
- meerschaum/core/Pipe/_sync.py +123 -204
- meerschaum/core/Pipe/_verify.py +4 -4
- meerschaum/{plugins → core/Plugin}/_Plugin.py +16 -12
- meerschaum/core/Plugin/__init__.py +1 -1
- meerschaum/core/Token/_Token.py +220 -0
- meerschaum/core/Token/__init__.py +12 -0
- meerschaum/core/User/_User.py +35 -10
- meerschaum/core/User/__init__.py +9 -1
- meerschaum/core/__init__.py +1 -0
- meerschaum/jobs/_Executor.py +88 -4
- meerschaum/jobs/_Job.py +149 -38
- meerschaum/jobs/__init__.py +3 -2
- meerschaum/jobs/systemd.py +8 -3
- meerschaum/models/__init__.py +35 -0
- meerschaum/models/pipes.py +247 -0
- meerschaum/models/tokens.py +38 -0
- meerschaum/models/users.py +26 -0
- meerschaum/plugins/__init__.py +301 -88
- meerschaum/plugins/bootstrap.py +510 -4
- meerschaum/utils/_get_pipes.py +97 -30
- meerschaum/utils/daemon/Daemon.py +199 -43
- meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -1
- meerschaum/utils/daemon/RotatingFile.py +63 -36
- meerschaum/utils/daemon/StdinFile.py +53 -13
- meerschaum/utils/daemon/__init__.py +47 -6
- meerschaum/utils/daemon/_names.py +6 -3
- meerschaum/utils/dataframe.py +480 -82
- meerschaum/utils/debug.py +49 -19
- meerschaum/utils/dtypes/__init__.py +478 -37
- meerschaum/utils/dtypes/sql.py +369 -29
- meerschaum/utils/formatting/__init__.py +5 -2
- meerschaum/utils/formatting/_jobs.py +1 -1
- meerschaum/utils/formatting/_pipes.py +52 -50
- meerschaum/utils/formatting/_pprint.py +1 -0
- meerschaum/utils/formatting/_shell.py +44 -18
- meerschaum/utils/misc.py +268 -186
- meerschaum/utils/packages/__init__.py +25 -40
- meerschaum/utils/packages/_packages.py +42 -34
- meerschaum/utils/pipes.py +213 -0
- meerschaum/utils/process.py +2 -2
- meerschaum/utils/prompt.py +175 -144
- meerschaum/utils/schedule.py +2 -1
- meerschaum/utils/sql.py +135 -49
- meerschaum/utils/threading.py +42 -0
- meerschaum/utils/typing.py +1 -4
- meerschaum/utils/venv/_Venv.py +2 -2
- meerschaum/utils/venv/__init__.py +7 -7
- meerschaum/utils/warnings.py +19 -13
- {meerschaum-2.9.4.dist-info → meerschaum-3.0.0.dist-info}/METADATA +94 -96
- meerschaum-3.0.0.dist-info/RECORD +289 -0
- {meerschaum-2.9.4.dist-info → meerschaum-3.0.0.dist-info}/WHEEL +1 -1
- meerschaum-3.0.0.dist-info/licenses/NOTICE +2 -0
- meerschaum/api/models/_interfaces.py +0 -15
- meerschaum/api/models/_locations.py +0 -15
- meerschaum/api/models/_metrics.py +0 -15
- meerschaum/config/_environment.py +0 -145
- meerschaum/config/static/__init__.py +0 -186
- meerschaum-2.9.4.dist-info/RECORD +0 -263
- {meerschaum-2.9.4.dist-info → meerschaum-3.0.0.dist-info}/entry_points.txt +0 -0
- {meerschaum-2.9.4.dist-info → meerschaum-3.0.0.dist-info}/licenses/LICENSE +0 -0
- {meerschaum-2.9.4.dist-info → meerschaum-3.0.0.dist-info}/top_level.txt +0 -0
- {meerschaum-2.9.4.dist-info → meerschaum-3.0.0.dist-info}/zip-safe +0 -0
@@ -6,6 +6,26 @@
|
|
6
6
|
Create and manipulate SQL tables with ORM
|
7
7
|
"""
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
import meerschaum as mrsm
|
10
|
+
import meerschaum.models
|
11
|
+
|
12
|
+
from meerschaum.api.models._pipes import (
|
13
|
+
FetchPipesKeysResponseModel,
|
14
|
+
SyncPipeRequestModel,
|
15
|
+
)
|
16
|
+
from meerschaum.api.models._actions import SuccessTupleResponseModel
|
17
|
+
from meerschaum.api.models._tokens import (
|
18
|
+
GetTokensResponseModel,
|
19
|
+
RegisterTokenResponseModel,
|
20
|
+
RegisterTokenRequestModel,
|
21
|
+
GetTokenResponseModel,
|
22
|
+
)
|
23
|
+
|
24
|
+
__all__ = (
|
25
|
+
'FetchPipesKeysResponseModel',
|
26
|
+
'SyncPipeRequestModel',
|
27
|
+
'SuccessTupleResponseModel',
|
28
|
+
'RegisterTokenResponseModel',
|
29
|
+
'RegisterTokenRequestModel',
|
30
|
+
'GetTokenResponseModel',
|
31
|
+
)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#! /usr/bin/env python3
|
2
|
+
# vim:fenc=utf-8
|
3
|
+
|
4
|
+
"""
|
5
|
+
Define actions response models.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from typing import Tuple
|
9
|
+
from pydantic import RootModel, ConfigDict
|
10
|
+
from meerschaum.utils.typing import SuccessTuple
|
11
|
+
|
12
|
+
|
13
|
+
class SuccessTupleResponseModel(RootModel[SuccessTuple]):
|
14
|
+
"""
|
15
|
+
A response model for a tuple of a boolean and a string.
|
16
|
+
E.g. `[true, "Success"]`
|
17
|
+
"""
|
18
|
+
model_config = ConfigDict(
|
19
|
+
json_schema_extra={
|
20
|
+
'example': [True, "Success"],
|
21
|
+
},
|
22
|
+
)
|
meerschaum/api/models/_pipes.py
CHANGED
@@ -8,14 +8,98 @@ Pydantic model for a pipe's keys.
|
|
8
8
|
|
9
9
|
from __future__ import annotations
|
10
10
|
|
11
|
+
from typing import Optional, List, Tuple, Dict, Union, Any
|
12
|
+
|
11
13
|
import meerschaum as mrsm
|
12
|
-
from meerschaum.utils.typing import Optional
|
13
14
|
|
14
|
-
|
15
|
+
from meerschaum.models.pipes import (
|
16
|
+
PipeModel as BasePipeModel,
|
17
|
+
ConnectorKeysModel,
|
18
|
+
MetricKeyModel,
|
19
|
+
LocationKeyModel,
|
20
|
+
)
|
21
|
+
|
22
|
+
pydantic = mrsm.attempt_import('pydantic', lazy=False)
|
23
|
+
from pydantic import (
|
24
|
+
BaseModel,
|
25
|
+
RootModel,
|
26
|
+
field_validator,
|
27
|
+
ValidationInfo,
|
28
|
+
ConfigDict,
|
29
|
+
)
|
30
|
+
|
31
|
+
|
32
|
+
class PipeModel(BasePipeModel):
|
33
|
+
"""
|
34
|
+
A `Pipe`'s model to be used in API responses.
|
35
|
+
"""
|
36
|
+
parameters: Optional[dict] = None
|
37
|
+
model_config = ConfigDict(
|
38
|
+
json_schema_extra={
|
39
|
+
'example': {
|
40
|
+
'connector_keys': 'sql:main',
|
41
|
+
'metric_key': 'weather',
|
42
|
+
'location_key': 'us.co.denver',
|
43
|
+
'instance_keys': 'sql:main',
|
44
|
+
'parameters': {
|
45
|
+
'columns': {
|
46
|
+
'datetime': 'dt',
|
47
|
+
'id': 'id',
|
48
|
+
'value': 'val',
|
49
|
+
},
|
50
|
+
},
|
51
|
+
},
|
52
|
+
},
|
53
|
+
)
|
54
|
+
|
55
|
+
|
56
|
+
class FetchPipesKeysResponseModel(
|
57
|
+
RootModel[
|
58
|
+
Union[
|
59
|
+
List[Tuple[ConnectorKeysModel, MetricKeyModel, LocationKeyModel]],
|
60
|
+
List[Tuple[ConnectorKeysModel, MetricKeyModel, LocationKeyModel, Dict[str, Any]]],
|
61
|
+
List[Tuple[ConnectorKeysModel, MetricKeyModel, LocationKeyModel, List[str]]],
|
62
|
+
]
|
63
|
+
]
|
64
|
+
):
|
65
|
+
"""
|
66
|
+
A list of tuples containing connector, metric, and location keys.
|
67
|
+
"""
|
68
|
+
model_config = ConfigDict(
|
69
|
+
json_schema_extra={
|
70
|
+
'example': [
|
71
|
+
['sql:main', 'weather', 'greenville'],
|
72
|
+
['plugin:noaa', 'weather', 'greenville'],
|
73
|
+
],
|
74
|
+
},
|
75
|
+
)
|
15
76
|
|
16
77
|
|
17
|
-
class
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
78
|
+
class SyncPipeRequestModel(
|
79
|
+
RootModel[
|
80
|
+
Union[
|
81
|
+
List[Dict[str, Any]],
|
82
|
+
Dict[str, List[Any]],
|
83
|
+
str
|
84
|
+
]
|
85
|
+
]
|
86
|
+
):
|
87
|
+
"""
|
88
|
+
The accepted formats of dataframes to be synced.
|
89
|
+
"""
|
90
|
+
model_config = ConfigDict(
|
91
|
+
json_schema_extra={
|
92
|
+
'example': [
|
93
|
+
{
|
94
|
+
'timestamp': '2026-01-01',
|
95
|
+
'id': 1,
|
96
|
+
'value': 100.1,
|
97
|
+
},
|
98
|
+
{
|
99
|
+
'timestamp': '2026-01-02',
|
100
|
+
'id': 1,
|
101
|
+
'value': 200.2,
|
102
|
+
}
|
103
|
+
],
|
104
|
+
}
|
105
|
+
)
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#! /usr/bin/env python3
|
2
|
+
# vim:fenc=utf-8
|
3
|
+
|
4
|
+
"""
|
5
|
+
Response models for tokens.
|
6
|
+
"""
|
7
|
+
|
8
|
+
import uuid
|
9
|
+
from datetime import datetime
|
10
|
+
from typing import Optional, List, Union
|
11
|
+
|
12
|
+
import meerschaum as mrsm
|
13
|
+
from meerschaum._internal.static import STATIC_CONFIG
|
14
|
+
|
15
|
+
from pydantic import BaseModel, RootModel, Field, ConfigDict
|
16
|
+
|
17
|
+
|
18
|
+
class RegisterTokenRequestModel(BaseModel):
|
19
|
+
label: Optional[str] = None
|
20
|
+
expiration: Optional[datetime] = None
|
21
|
+
scopes: List[str] = Field(default_factory=lambda: list(STATIC_CONFIG['tokens']['scopes']))
|
22
|
+
model_config = ConfigDict(
|
23
|
+
json_schema_extra = {
|
24
|
+
'examples': [
|
25
|
+
{
|
26
|
+
'label': 'my-iot-device',
|
27
|
+
'expiration': '2026-01-01T00:00:00Z',
|
28
|
+
'scopes': list(STATIC_CONFIG['tokens']['scopes']),
|
29
|
+
}
|
30
|
+
]
|
31
|
+
}
|
32
|
+
)
|
33
|
+
|
34
|
+
|
35
|
+
class RegisterTokenResponseModel(BaseModel):
|
36
|
+
label: str
|
37
|
+
secret: str
|
38
|
+
id: uuid.UUID
|
39
|
+
api_key: str
|
40
|
+
expiration: Optional[datetime]
|
41
|
+
model_config = ConfigDict(
|
42
|
+
json_schema_extra = {
|
43
|
+
'examples': [
|
44
|
+
{
|
45
|
+
'label': 'my-iot-device',
|
46
|
+
'secret': 'a_very_long_secret_string_that_is_only_shown_once',
|
47
|
+
'id': '1540c2f6-a99d-463c-bfab-47d361200123',
|
48
|
+
'expiration': '2026-01-01T00:00:00Z',
|
49
|
+
'api_key': 'mrsm-key:MTU0MGMyZjYtYTk5ZC00NjNjLWJmYWItNDdkMzYxMjAwMTIzOmFfdmVyeV9sb25nX3NlY3JldF9zdHJpbmdfdGhhdF9pc19vbmx5X3Nob3duX29uY2U=',
|
50
|
+
}
|
51
|
+
]
|
52
|
+
}
|
53
|
+
)
|
54
|
+
|
55
|
+
|
56
|
+
class GetTokenResponseModel(BaseModel):
|
57
|
+
id: Optional[uuid.UUID] = Field(default=None)
|
58
|
+
creation: datetime = Field()
|
59
|
+
expiration: Optional[datetime] = Field()
|
60
|
+
label: str = Field()
|
61
|
+
user_id: Optional[Union[int, str, uuid.UUID]] = Field(default=None)
|
62
|
+
scopes: List[str] = Field(default=list(STATIC_CONFIG['tokens']['scopes']))
|
63
|
+
is_valid: bool = Field(default=True)
|
64
|
+
|
65
|
+
|
66
|
+
class GetTokensResponseModel(RootModel[List[GetTokenResponseModel]]):
|
67
|
+
model_config = ConfigDict(
|
68
|
+
json_schema_extra={
|
69
|
+
'example': [
|
70
|
+
{
|
71
|
+
'label': 'my-iot-device',
|
72
|
+
'id': '1540c2f6-a99d-463c-bfab-47d361200123',
|
73
|
+
'user_id': 1,
|
74
|
+
'scopes': ['pipes:write'],
|
75
|
+
'creation': '2025-07-01T00:00:00Z',
|
76
|
+
'expiration': '2026-01-01T00:00:00Z',
|
77
|
+
'is_valid': True,
|
78
|
+
},
|
79
|
+
],
|
80
|
+
}
|
81
|
+
)
|
@@ -80,3 +80,19 @@ a {
|
|
80
80
|
.pages-offcanvas-accordion div {
|
81
81
|
padding: 0 !important;
|
82
82
|
}
|
83
|
+
|
84
|
+
/* restyle radio items */
|
85
|
+
.radio-group .form-check {
|
86
|
+
padding-left: 0;
|
87
|
+
}
|
88
|
+
|
89
|
+
.radio-group .btn-group > .form-check:not(:last-child) > .btn {
|
90
|
+
border-top-right-radius: 0;
|
91
|
+
border-bottom-right-radius: 0;
|
92
|
+
}
|
93
|
+
|
94
|
+
.radio-group .btn-group > .form-check:not(:first-child) > .btn {
|
95
|
+
border-top-left-radius: 0;
|
96
|
+
border-bottom-left-radius: 0;
|
97
|
+
margin-left: -1px;
|
98
|
+
}
|
@@ -11,7 +11,10 @@ function make_terminal(element, size, ws_url) {
|
|
11
11
|
useStyle: true,
|
12
12
|
scrollback: 9999999,
|
13
13
|
cursorBlink: true,
|
14
|
+
allowProposedApi: true
|
14
15
|
});
|
16
|
+
term.loadAddon(new Unicode11Addon.Unicode11Addon());
|
17
|
+
term.unicode.activeVersion = '11';
|
15
18
|
term.attachCustomKeyEventHandler(copyPasteKeyEventHandler);
|
16
19
|
term.open(element);
|
17
20
|
|
@@ -0,0 +1,2 @@
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Unicode11Addon=t():e.Unicode11Addon=t()}(this,(()=>(()=>{"use strict";var e={433:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV11=void 0;const r=i(938),s=[[768,879],[1155,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1541],[1552,1562],[1564,1564],[1611,1631],[1648,1648],[1750,1757],[1759,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2045,2045],[2070,2073],[2075,2083],[2085,2087],[2089,2093],[2137,2139],[2259,2306],[2362,2362],[2364,2364],[2369,2376],[2381,2381],[2385,2391],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2558,2558],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2641,2641],[2672,2673],[2677,2677],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2810,2815],[2817,2817],[2876,2876],[2879,2879],[2881,2884],[2893,2893],[2902,2902],[2914,2915],[2946,2946],[3008,3008],[3021,3021],[3072,3072],[3076,3076],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3170,3171],[3201,3201],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3328,3329],[3387,3388],[3393,3396],[3405,3405],[3426,3427],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3981,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4151],[4153,4154],[4157,4158],[4184,4185],[4190,4192],[4209,4212],[4226,4226],[4229,4230],[4237,4237],[4253,4253],[4448,4607],[4957,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6158],[6277,6278],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6683,6683],[6742,6742],[6744,6750],[6752,6752],[6754,6754],[6757,6764],[6771,6780],[6783,6783],[6832,6846],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7040,7041],[7074,7077],[7080,7081],[7083,7085],[7142,7142],[7144,7145],[7149,7149],[7151,7153],[7212,7219],[7222,7223],[7376,7378],[7380,7392],[7394,7400],[7405,7405],[7412,7412],[7416,7417],[7616,7673],[7675,7679],[8203,8207],[8234,8238],[8288,8292],[8294,8303],[8400,8432],[11503,11505],[11647,11647],[11744,11775],[12330,12333],[12441,12442],[42607,42610],[42612,42621],[42654,42655],[42736,42737],[43010,43010],[43014,43014],[43019,43019],[43045,43046],[43204,43205],[43232,43249],[43263,43263],[43302,43309],[43335,43345],[43392,43394],[43443,43443],[43446,43449],[43452,43453],[43493,43493],[43561,43566],[43569,43570],[43573,43574],[43587,43587],[43596,43596],[43644,43644],[43696,43696],[43698,43700],[43703,43704],[43710,43711],[43713,43713],[43756,43757],[43766,43766],[44005,44005],[44008,44008],[44013,44013],[64286,64286],[65024,65039],[65056,65071],[65279,65279],[65529,65531]],n=[[66045,66045],[66272,66272],[66422,66426],[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[68325,68326],[68900,68903],[69446,69456],[69633,69633],[69688,69702],[69759,69761],[69811,69814],[69817,69818],[69821,69821],[69837,69837],[69888,69890],[69927,69931],[69933,69940],[70003,70003],[70016,70017],[70070,70078],[70089,70092],[70191,70193],[70196,70196],[70198,70199],[70206,70206],[70367,70367],[70371,70378],[70400,70401],[70459,70460],[70464,70464],[70502,70508],[70512,70516],[70712,70719],[70722,70724],[70726,70726],[70750,70750],[70835,70840],[70842,70842],[70847,70848],[70850,70851],[71090,71093],[71100,71101],[71103,71104],[71132,71133],[71219,71226],[71229,71229],[71231,71232],[71339,71339],[71341,71341],[71344,71349],[71351,71351],[71453,71455],[71458,71461],[71463,71467],[71727,71735],[71737,71738],[72148,72151],[72154,72155],[72160,72160],[72193,72202],[72243,72248],[72251,72254],[72263,72263],[72273,72278],[72281,72283],[72330,72342],[72344,72345],[72752,72758],[72760,72765],[72767,72767],[72850,72871],[72874,72880],[72882,72883],[72885,72886],[73009,73014],[73018,73018],[73020,73021],[73023,73029],[73031,73031],[73104,73105],[73109,73109],[73111,73111],[73459,73460],[78896,78904],[92912,92916],[92976,92982],[94031,94031],[94095,94098],[113821,113822],[113824,113827],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[121344,121398],[121403,121452],[121461,121461],[121476,121476],[121499,121503],[121505,121519],[122880,122886],[122888,122904],[122907,122913],[122915,122916],[122918,122922],[123184,123190],[123628,123631],[125136,125142],[125252,125258],[917505,917505],[917536,917631],[917760,917999]],o=[[4352,4447],[8986,8987],[9001,9002],[9193,9196],[9200,9200],[9203,9203],[9725,9726],[9748,9749],[9800,9811],[9855,9855],[9875,9875],[9889,9889],[9898,9899],[9917,9918],[9924,9925],[9934,9934],[9940,9940],[9962,9962],[9970,9971],[9973,9973],[9978,9978],[9981,9981],[9989,9989],[9994,9995],[10024,10024],[10060,10060],[10062,10062],[10067,10069],[10071,10071],[10133,10135],[10160,10160],[10175,10175],[11035,11036],[11088,11088],[11093,11093],[11904,11929],[11931,12019],[12032,12245],[12272,12283],[12288,12329],[12334,12350],[12353,12438],[12443,12543],[12549,12591],[12593,12686],[12688,12730],[12736,12771],[12784,12830],[12832,12871],[12880,19903],[19968,42124],[42128,42182],[43360,43388],[44032,55203],[63744,64255],[65040,65049],[65072,65106],[65108,65126],[65128,65131],[65281,65376],[65504,65510]],c=[[94176,94179],[94208,100343],[100352,101106],[110592,110878],[110928,110930],[110948,110951],[110960,111355],[126980,126980],[127183,127183],[127374,127374],[127377,127386],[127488,127490],[127504,127547],[127552,127560],[127568,127569],[127584,127589],[127744,127776],[127789,127797],[127799,127868],[127870,127891],[127904,127946],[127951,127955],[127968,127984],[127988,127988],[127992,128062],[128064,128064],[128066,128252],[128255,128317],[128331,128334],[128336,128359],[128378,128378],[128405,128406],[128420,128420],[128507,128591],[128640,128709],[128716,128716],[128720,128722],[128725,128725],[128747,128748],[128756,128762],[128992,129003],[129293,129393],[129395,129398],[129402,129442],[129445,129450],[129454,129482],[129485,129535],[129648,129651],[129656,129658],[129664,129666],[129680,129685],[131072,196605],[196608,262141]];let l;function d(e,t){let i,r=0,s=t.length-1;if(e<t[0][0]||e>t[s][1])return!1;for(;s>=r;)if(i=r+s>>1,e>t[i][1])r=i+1;else{if(!(e<t[i][0]))return!0;s=i-1}return!1}t.UnicodeV11=class{constructor(){if(this.version="11",!l){l=new Uint8Array(65536),l.fill(1),l[0]=0,l.fill(0,1,32),l.fill(0,127,160);for(let e=0;e<s.length;++e)l.fill(0,s[e][0],s[e][1]+1);for(let e=0;e<o.length;++e)l.fill(2,o[e][0],o[e][1]+1)}}wcwidth(e){return e<32?0:e<127?1:e<65536?l[e]:d(e,n)?0:d(e,c)?2:1}charProperties(e,t){let i=this.wcwidth(e),s=0===i&&0!==t;if(s){const e=r.UnicodeService.extractWidth(t);0===e?s=!1:e>i&&(i=e)}return r.UnicodeService.createPropertyValue(0,i,s)}}},345:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.runAndSubscribe=t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}})),this._event}fire(e,t){const i=[];for(let e=0;e<this._listeners.length;e++)i.push(this._listeners[e]);for(let r=0;r<i.length;r++)i[r].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))},t.runAndSubscribe=function(e,t){return t(void 0),e((e=>t(e)))}},490:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const r=i(938),s=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],n=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]];let o;t.UnicodeV6=class{constructor(){if(this.version="6",!o){o=new Uint8Array(65536),o.fill(1),o[0]=0,o.fill(0,1,32),o.fill(0,127,160),o.fill(2,4352,4448),o[9001]=2,o[9002]=2,o.fill(2,11904,42192),o[12351]=1,o.fill(2,44032,55204),o.fill(2,63744,64256),o.fill(2,65040,65050),o.fill(2,65072,65136),o.fill(2,65280,65377),o.fill(2,65504,65511);for(let e=0;e<s.length;++e)o.fill(0,s[e][0],s[e][1]+1)}}wcwidth(e){return e<32?0:e<127?1:e<65536?o[e]:function(e,t){let i,r=0,s=t.length-1;if(e<t[0][0]||e>t[s][1])return!1;for(;s>=r;)if(i=r+s>>1,e>t[i][1])r=i+1;else{if(!(e<t[i][0]))return!0;s=i-1}return!1}(e,n)?0:e>=131072&&e<=196605||e>=196608&&e<=262141?2:1}charProperties(e,t){let i=this.wcwidth(e),s=0===i&&0!==t;if(s){const e=r.UnicodeService.extractWidth(t);0===e?s=!1:e>i&&(i=e)}return r.UnicodeService.createPropertyValue(0,i,s)}}},938:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeService=void 0;const r=i(345),s=i(490);class n{static extractShouldJoin(e){return 0!=(1&e)}static extractWidth(e){return e>>1&3}static extractCharKind(e){return e>>3}static createPropertyValue(e,t,i=!1){return(16777215&e)<<3|(3&t)<<1|(i?1:0)}constructor(){this._providers=Object.create(null),this._active="",this._onChange=new r.EventEmitter,this.onChange=this._onChange.event;const e=new s.UnicodeV6;this.register(e),this._active=e.version,this._activeProvider=e}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(e){if(!this._providers[e])throw new Error(`unknown Unicode version "${e}"`);this._active=e,this._activeProvider=this._providers[e],this._onChange.fire(e)}register(e){this._providers[e.version]=e}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0,i=0;const r=e.length;for(let s=0;s<r;++s){let o=e.charCodeAt(s);if(55296<=o&&o<=56319){if(++s>=r)return t+this.wcwidth(o);const i=e.charCodeAt(s);56320<=i&&i<=57343?o=1024*(o-55296)+i-56320+65536:t+=this.wcwidth(i)}const c=this.charProperties(o,i);let l=n.extractWidth(c);n.extractShouldJoin(c)&&(l-=n.extractWidth(i)),t+=l,i=c}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=n}},t={};function i(r){var s=t[r];if(void 0!==s)return s.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,i),n.exports}var r={};return(()=>{var e=r;Object.defineProperty(e,"__esModule",{value:!0}),e.Unicode11Addon=void 0;const t=i(433);e.Unicode11Addon=class{activate(e){e.unicode.register(new t.UnicodeV11)}dispose(){}}})(),r})()));
|
2
|
+
//# sourceMappingURL=addon-unicode11.js.map
|
@@ -9,6 +9,7 @@
|
|
9
9
|
</style>
|
10
10
|
<link rel="stylesheet" href="{{ static('css/xterm.css') }}"/>
|
11
11
|
<script src="{{ static('js/xterm.js') }}"></script>
|
12
|
+
<script src="{{ static('js/xterm-addon-unicode11.js') }}"></script>
|
12
13
|
<script src="{{ static('js/terminado.js') }}"></script>
|
13
14
|
<script>
|
14
15
|
|
@@ -30,6 +31,7 @@ window.addEventListener(
|
|
30
31
|
let connector_keys = event.data['connector_keys'] ? event.data['connector_keys'] : [];
|
31
32
|
let metric_keys = event.data['metric_keys'] ? event.data['metric_keys'] : [];
|
32
33
|
let location_keys = event.data['location_keys'] ? event.data['location_keys'] : [];
|
34
|
+
let tags = event.data['tags'] ? event.data['tags'] : [];
|
33
35
|
let connector_keys_str = " -c";
|
34
36
|
for (let ck of connector_keys){
|
35
37
|
if (typeof ck === "string"){
|
@@ -62,6 +64,16 @@ window.addEventListener(
|
|
62
64
|
if (location_keys_str === " -l"){
|
63
65
|
location_keys_str = "";
|
64
66
|
}
|
67
|
+
let tags_str = " -t";
|
68
|
+
for (tag of tags){
|
69
|
+
if (typeof tag === "string"){
|
70
|
+
quote_str = tag.includes(" ") ? "'" : "";
|
71
|
+
tags_str += " " + quote_str + tag + quote_str;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
if (tags_str === " -t"){
|
75
|
+
tags_str = "";
|
76
|
+
}
|
65
77
|
|
66
78
|
let instance = event.data['instance'] ? event.data['instance'] : '';
|
67
79
|
let flags_str = "";
|
@@ -105,6 +117,7 @@ window.addEventListener(
|
|
105
117
|
+ connector_keys_str
|
106
118
|
+ metric_keys_str
|
107
119
|
+ location_keys_str
|
120
|
+
+ tags_str
|
108
121
|
+ flags_str
|
109
122
|
+ '\r'
|
110
123
|
);
|
@@ -15,6 +15,7 @@ import meerschaum.api.routes._misc
|
|
15
15
|
import meerschaum.api.routes._pipes
|
16
16
|
import meerschaum.api.routes._plugins
|
17
17
|
import meerschaum.api.routes._users
|
18
|
+
import meerschaum.api.routes._tokens
|
18
19
|
import meerschaum.api.routes._version
|
19
20
|
|
20
21
|
from meerschaum.api import _include_dash
|
@@ -18,6 +18,7 @@ from meerschaum.api import (
|
|
18
18
|
manager,
|
19
19
|
private,
|
20
20
|
no_auth,
|
21
|
+
ScopedAuth,
|
21
22
|
)
|
22
23
|
from meerschaum.actions import actions
|
23
24
|
from meerschaum.core.User import is_user_allowed_to_execute
|
@@ -28,7 +29,7 @@ actions_endpoint = endpoints['actions']
|
|
28
29
|
@app.get(actions_endpoint, tags=['Actions'])
|
29
30
|
def get_actions(
|
30
31
|
curr_user = (
|
31
|
-
fastapi.Depends(
|
32
|
+
fastapi.Depends(ScopedAuth(['actions:execute'])) if private else None
|
32
33
|
),
|
33
34
|
) -> List[str]:
|
34
35
|
"""
|
@@ -41,9 +42,7 @@ def get_actions(
|
|
41
42
|
def do_action_legacy(
|
42
43
|
action: str,
|
43
44
|
keywords: Dict[str, Any] = fastapi.Body(...),
|
44
|
-
curr_user = (
|
45
|
-
fastapi.Depends(manager) if not no_auth else None
|
46
|
-
),
|
45
|
+
curr_user = fastapi.Depends(ScopedAuth(['actions:execute'])),
|
47
46
|
) -> SuccessTuple:
|
48
47
|
"""
|
49
48
|
Perform a Meerschaum action (if permissions allow).
|
@@ -10,7 +10,7 @@ import fastapi
|
|
10
10
|
from fastapi import HTTPException
|
11
11
|
|
12
12
|
import meerschaum as mrsm
|
13
|
-
from meerschaum.api import app, endpoints,
|
13
|
+
from meerschaum.api import app, endpoints, ScopedAuth
|
14
14
|
from meerschaum.utils.typing import Optional, Dict, List, Union
|
15
15
|
|
16
16
|
endpoint = endpoints['connectors']
|
@@ -19,9 +19,7 @@ endpoint = endpoints['connectors']
|
|
19
19
|
@app.get(endpoint, tags=['Connectors'])
|
20
20
|
def get_connectors(
|
21
21
|
type: Optional[str] = None,
|
22
|
-
curr_user
|
23
|
-
fastapi.Depends(manager) if not no_auth else None
|
24
|
-
),
|
22
|
+
curr_user=fastapi.Depends(ScopedAuth(['connectors:read'])),
|
25
23
|
) -> Union[Dict[str, List[str]], List[str]]:
|
26
24
|
"""
|
27
25
|
Return the keys of the registered connectors.
|
@@ -54,9 +52,7 @@ def get_connectors(
|
|
54
52
|
@app.get(endpoint + "/{type}", tags=['Connectors'])
|
55
53
|
def get_connectors_by_type(
|
56
54
|
type: str,
|
57
|
-
curr_user
|
58
|
-
fastapi.Depends(manager) if not no_auth else None
|
59
|
-
),
|
55
|
+
curr_user=fastapi.Depends(ScopedAuth(['connectors:read']))
|
60
56
|
):
|
61
57
|
"""
|
62
58
|
Convenience method for `get_connectors()`.
|
meerschaum/api/routes/_jobs.py
CHANGED
@@ -28,11 +28,12 @@ from meerschaum.api import (
|
|
28
28
|
fastapi,
|
29
29
|
app,
|
30
30
|
endpoints,
|
31
|
-
|
31
|
+
ScopedAuth,
|
32
32
|
no_auth,
|
33
|
+
manager,
|
33
34
|
debug,
|
34
35
|
)
|
35
|
-
from meerschaum.
|
36
|
+
from meerschaum._internal.static import STATIC_CONFIG
|
36
37
|
from meerschaum.core.User import is_user_allowed_to_execute
|
37
38
|
|
38
39
|
|
@@ -53,9 +54,7 @@ def _get_job(name: str, sysargs: Union[str, List[str], None] = None):
|
|
53
54
|
|
54
55
|
@app.get(endpoints['jobs'], tags=['Jobs'])
|
55
56
|
def get_jobs(
|
56
|
-
curr_user=(
|
57
|
-
fastapi.Depends(manager) if not no_auth else None
|
58
|
-
),
|
57
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
|
59
58
|
) -> Dict[str, Dict[str, Any]]:
|
60
59
|
"""
|
61
60
|
Return metadata about the current jobs.
|
@@ -84,9 +83,7 @@ def get_jobs(
|
|
84
83
|
@app.get(endpoints['jobs'] + '/{name}', tags=['Jobs'])
|
85
84
|
def get_job(
|
86
85
|
name: str,
|
87
|
-
curr_user=(
|
88
|
-
fastapi.Depends(manager) if not no_auth else None
|
89
|
-
),
|
86
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
|
90
87
|
) -> Dict[str, Any]:
|
91
88
|
"""
|
92
89
|
Return metadata for a single job.
|
@@ -137,9 +134,7 @@ def clean_sysargs(sysargs: List[str]) -> List[str]:
|
|
137
134
|
def create_job(
|
138
135
|
name: str,
|
139
136
|
metadata: Union[List[str], Dict[str, Any]],
|
140
|
-
curr_user=(
|
141
|
-
fastapi.Depends(manager) if not no_auth else None
|
142
|
-
),
|
137
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:execute', 'jobs:write'])),
|
143
138
|
) -> SuccessTuple:
|
144
139
|
"""
|
145
140
|
Create and start a new job.
|
@@ -172,9 +167,7 @@ def create_job(
|
|
172
167
|
@app.delete(endpoints['jobs'] + '/{name}', tags=['Jobs'])
|
173
168
|
def delete_job(
|
174
169
|
name: str,
|
175
|
-
curr_user=(
|
176
|
-
fastapi.Depends(manager) if not no_auth else None
|
177
|
-
),
|
170
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:delete'])),
|
178
171
|
) -> SuccessTuple:
|
179
172
|
"""
|
180
173
|
Delete a job.
|
@@ -189,9 +182,7 @@ def delete_job(
|
|
189
182
|
@app.get(endpoints['jobs'] + '/{name}/exists', tags=['Jobs'])
|
190
183
|
def get_job_exists(
|
191
184
|
name: str,
|
192
|
-
curr_user=(
|
193
|
-
fastapi.Depends(manager) if not no_auth else None
|
194
|
-
),
|
185
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
|
195
186
|
) -> bool:
|
196
187
|
"""
|
197
188
|
Return whether a job exists.
|
@@ -203,9 +194,7 @@ def get_job_exists(
|
|
203
194
|
@app.get(endpoints['logs'] + '/{name}', tags=['Jobs'])
|
204
195
|
def get_logs(
|
205
196
|
name: str,
|
206
|
-
curr_user=(
|
207
|
-
fastapi.Depends(manager) if not no_auth else None
|
208
|
-
),
|
197
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:read', 'logs:read'])),
|
209
198
|
) -> Union[str, None]:
|
210
199
|
"""
|
211
200
|
Return a job's log text.
|
@@ -224,9 +213,7 @@ def get_logs(
|
|
224
213
|
@app.post(endpoints['jobs'] + '/{name}/start', tags=['Jobs'])
|
225
214
|
def start_job(
|
226
215
|
name: str,
|
227
|
-
curr_user=(
|
228
|
-
fastapi.Depends(manager) if not no_auth else None
|
229
|
-
),
|
216
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:execute'])),
|
230
217
|
) -> SuccessTuple:
|
231
218
|
"""
|
232
219
|
Start a job if stopped.
|
@@ -247,9 +234,7 @@ def start_job(
|
|
247
234
|
@app.post(endpoints['jobs'] + '/{name}/stop', tags=['Jobs'])
|
248
235
|
def stop_job(
|
249
236
|
name: str,
|
250
|
-
curr_user=(
|
251
|
-
fastapi.Depends(manager) if not no_auth else None
|
252
|
-
),
|
237
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:execute', 'josb:stop'])),
|
253
238
|
) -> SuccessTuple:
|
254
239
|
"""
|
255
240
|
Stop a job if running.
|
@@ -270,9 +255,7 @@ def stop_job(
|
|
270
255
|
@app.post(endpoints['jobs'] + '/{name}/pause', tags=['Jobs'])
|
271
256
|
def pause_job(
|
272
257
|
name: str,
|
273
|
-
curr_user=(
|
274
|
-
fastapi.Depends(manager) if not no_auth else None
|
275
|
-
),
|
258
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:execute', 'jobs:pause'])),
|
276
259
|
) -> SuccessTuple:
|
277
260
|
"""
|
278
261
|
Pause a job if running.
|
@@ -293,9 +276,7 @@ def pause_job(
|
|
293
276
|
@app.get(endpoints['jobs'] + '/{name}/stop_time', tags=['Jobs'])
|
294
277
|
def get_stop_time(
|
295
278
|
name: str,
|
296
|
-
curr_user=(
|
297
|
-
fastapi.Depends(manager) if not no_auth else None
|
298
|
-
),
|
279
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
|
299
280
|
) -> Union[datetime, None]:
|
300
281
|
"""
|
301
282
|
Get the timestamp when the job was manually stopped.
|
@@ -307,9 +288,7 @@ def get_stop_time(
|
|
307
288
|
@app.get(endpoints['jobs'] + '/{name}/is_blocking_on_stdin', tags=['Jobs'])
|
308
289
|
def get_is_blocking_on_stdin(
|
309
290
|
name: str,
|
310
|
-
curr_user=(
|
311
|
-
fastapi.Depends(manager) if not no_auth else None
|
312
|
-
),
|
291
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
|
313
292
|
) -> bool:
|
314
293
|
"""
|
315
294
|
Return whether a job is blocking on stdin.
|
@@ -318,6 +297,18 @@ def get_is_blocking_on_stdin(
|
|
318
297
|
return job.is_blocking_on_stdin()
|
319
298
|
|
320
299
|
|
300
|
+
@app.get(endpoints['jobs'] + '{name}/prompt_kwargs', tags=['Jobs'])
|
301
|
+
def get_prompt_kwargs(
|
302
|
+
name: str,
|
303
|
+
curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
|
304
|
+
) -> Dict[str, Any]:
|
305
|
+
"""
|
306
|
+
Return the kwargs for the blocking `prompt`, if available.
|
307
|
+
"""
|
308
|
+
job = _get_job(name)
|
309
|
+
return job.get_prompt_kwargs()
|
310
|
+
|
311
|
+
|
321
312
|
_job_clients = defaultdict(lambda: [])
|
322
313
|
_job_stop_events = defaultdict(lambda: asyncio.Event())
|
323
314
|
_job_queues = defaultdict(lambda: asyncio.Queue())
|