fractal-server 2.5.0a1__py3-none-any.whl → 2.5.1__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.
- fractal_server/__init__.py +1 -1
- fractal_server/app/routes/api/v2/task_collection_custom.py +2 -1
- fractal_server/app/runner/compress_folder.py +1 -1
- fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py +2 -0
- fractal_server/app/runner/executors/slurm/sudo/executor.py +3 -0
- fractal_server/app/runner/run_subprocess.py +5 -1
- fractal_server/app/runner/v1/_common.py +2 -0
- fractal_server/app/runner/v2/runner_functions_low_level.py +5 -0
- fractal_server/app/schemas/user.py +15 -10
- fractal_server/app/schemas/v2/dumps.py +11 -2
- fractal_server/app/schemas/v2/task.py +6 -0
- fractal_server/ssh/_fabric.py +6 -0
- fractal_server/string_tools.py +25 -0
- {fractal_server-2.5.0a1.dist-info → fractal_server-2.5.1.dist-info}/METADATA +1 -1
- {fractal_server-2.5.0a1.dist-info → fractal_server-2.5.1.dist-info}/RECORD +18 -18
- {fractal_server-2.5.0a1.dist-info → fractal_server-2.5.1.dist-info}/LICENSE +0 -0
- {fractal_server-2.5.0a1.dist-info → fractal_server-2.5.1.dist-info}/WHEEL +0 -0
- {fractal_server-2.5.0a1.dist-info → fractal_server-2.5.1.dist-info}/entry_points.txt +0 -0
fractal_server/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__VERSION__ = "2.5.
|
1
|
+
__VERSION__ = "2.5.1"
|
@@ -20,12 +20,12 @@ from ....schemas.v2 import TaskCreateV2
|
|
20
20
|
from ....schemas.v2 import TaskReadV2
|
21
21
|
from fractal_server.app.models import UserOAuth
|
22
22
|
from fractal_server.app.routes.auth import current_active_verified_user
|
23
|
+
from fractal_server.string_tools import validate_cmd
|
23
24
|
from fractal_server.tasks.v2.background_operations import _insert_tasks
|
24
25
|
from fractal_server.tasks.v2.background_operations import (
|
25
26
|
_prepare_tasks_metadata,
|
26
27
|
)
|
27
28
|
|
28
|
-
|
29
29
|
router = APIRouter()
|
30
30
|
|
31
31
|
logger = set_logger(__name__)
|
@@ -74,6 +74,7 @@ async def collect_task_custom(
|
|
74
74
|
package_name_underscore = task_collect.package_name.replace("-", "_")
|
75
75
|
# Note that python_command is then used as part of a subprocess.run
|
76
76
|
# statement: be careful with mixing `'` and `"`.
|
77
|
+
validate_cmd(package_name_underscore)
|
77
78
|
python_command = (
|
78
79
|
"import importlib.util; "
|
79
80
|
"from pathlib import Path; "
|
@@ -48,7 +48,7 @@ def create_tar_archive(
|
|
48
48
|
"."
|
49
49
|
)
|
50
50
|
logger.debug(f"cmd tar:\n{cmd_tar}")
|
51
|
-
run_subprocess(cmd=cmd_tar, logger_name=logger_name)
|
51
|
+
run_subprocess(cmd=cmd_tar, logger_name=logger_name, allow_char="*")
|
52
52
|
|
53
53
|
|
54
54
|
def remove_temp_subfolder(subfolder_path_tmp_copy: Path, logger_name: str):
|
@@ -20,6 +20,7 @@ import subprocess # nosec
|
|
20
20
|
from typing import Optional
|
21
21
|
|
22
22
|
from ......logger import set_logger
|
23
|
+
from fractal_server.string_tools import validate_cmd
|
23
24
|
|
24
25
|
logger = set_logger(__name__)
|
25
26
|
|
@@ -47,6 +48,7 @@ def _run_command_as_user(
|
|
47
48
|
Returns:
|
48
49
|
res: The return value from `subprocess.run`.
|
49
50
|
"""
|
51
|
+
validate_cmd(cmd)
|
50
52
|
logger.debug(f'[_run_command_as_user] {user=}, cmd="{cmd}"')
|
51
53
|
if user:
|
52
54
|
new_cmd = f"sudo --set-home --non-interactive -u {user} {cmd}"
|
@@ -47,6 +47,7 @@ from ._subprocess_run_as_user import _path_exists_as_user
|
|
47
47
|
from ._subprocess_run_as_user import _run_command_as_user
|
48
48
|
from fractal_server import __VERSION__
|
49
49
|
from fractal_server.app.runner.components import _COMPONENT_KEY_
|
50
|
+
from fractal_server.string_tools import validate_cmd
|
50
51
|
|
51
52
|
|
52
53
|
logger = set_logger(__name__)
|
@@ -65,6 +66,7 @@ def _subprocess_run_or_raise(full_command: str) -> Optional[CompletedProcess]:
|
|
65
66
|
Returns:
|
66
67
|
The actual `CompletedProcess` output of `subprocess.run`.
|
67
68
|
"""
|
69
|
+
validate_cmd(full_command)
|
68
70
|
try:
|
69
71
|
output = subprocess.run( # nosec
|
70
72
|
shlex.split(full_command),
|
@@ -1266,6 +1268,7 @@ class FractalSlurmExecutor(SlurmExecutor):
|
|
1266
1268
|
pre_command = f"sudo --non-interactive -u {self.slurm_user}"
|
1267
1269
|
submit_command = f"scancel {scancel_string}"
|
1268
1270
|
full_command = f"{pre_command} {submit_command}"
|
1271
|
+
validate_cmd(full_command)
|
1269
1272
|
logger.debug(f"Now execute `{full_command}`")
|
1270
1273
|
try:
|
1271
1274
|
subprocess.run( # nosec
|
@@ -3,11 +3,15 @@ import subprocess # nosec
|
|
3
3
|
from typing import Optional
|
4
4
|
|
5
5
|
from fractal_server.logger import get_logger
|
6
|
+
from fractal_server.string_tools import validate_cmd
|
6
7
|
|
7
8
|
|
8
9
|
def run_subprocess(
|
9
|
-
cmd: str,
|
10
|
+
cmd: str,
|
11
|
+
allow_char: Optional[str] = None,
|
12
|
+
logger_name: Optional[str] = None,
|
10
13
|
) -> subprocess.CompletedProcess:
|
14
|
+
validate_cmd(cmd, allow_char=allow_char)
|
11
15
|
logger = get_logger(logger_name)
|
12
16
|
try:
|
13
17
|
res = subprocess.run( # nosec
|
@@ -31,6 +31,7 @@ from .common import write_args_file
|
|
31
31
|
from fractal_server.app.runner.filenames import HISTORY_FILENAME
|
32
32
|
from fractal_server.app.runner.filenames import METADATA_FILENAME
|
33
33
|
from fractal_server.app.runner.task_files import get_task_file_paths
|
34
|
+
from fractal_server.string_tools import validate_cmd
|
34
35
|
|
35
36
|
|
36
37
|
def no_op_submit_setup_call(
|
@@ -77,6 +78,7 @@ def _call_command_wrapper(cmd: str, stdout: Path, stderr: Path) -> None:
|
|
77
78
|
TERM or KILL signal)
|
78
79
|
"""
|
79
80
|
|
81
|
+
validate_cmd(cmd)
|
80
82
|
# Verify that task command is executable
|
81
83
|
if shutil.which(shlex_split(cmd)[0]) is None:
|
82
84
|
msg = (
|
@@ -12,6 +12,7 @@ from ..exceptions import JobExecutionError
|
|
12
12
|
from ..exceptions import TaskExecutionError
|
13
13
|
from fractal_server.app.models.v2 import WorkflowTaskV2
|
14
14
|
from fractal_server.app.runner.task_files import get_task_file_paths
|
15
|
+
from fractal_server.string_tools import validate_cmd
|
15
16
|
|
16
17
|
|
17
18
|
def _call_command_wrapper(cmd: str, log_path: Path) -> None:
|
@@ -25,6 +26,10 @@ def _call_command_wrapper(cmd: str, log_path: Path) -> None:
|
|
25
26
|
exit code (e.g. due to the subprocess receiving a
|
26
27
|
TERM or KILL signal)
|
27
28
|
"""
|
29
|
+
try:
|
30
|
+
validate_cmd(cmd)
|
31
|
+
except ValueError as e:
|
32
|
+
raise TaskExecutionError(f"Invalid command. Original error: {str(e)}")
|
28
33
|
|
29
34
|
# Verify that task command is executable
|
30
35
|
if shutil.which(shlex_split(cmd)[0]) is None:
|
@@ -10,7 +10,7 @@ from pydantic.types import StrictStr
|
|
10
10
|
from ._validators import val_absolute_path
|
11
11
|
from ._validators import val_unique_list
|
12
12
|
from ._validators import valstr
|
13
|
-
|
13
|
+
from fractal_server.string_tools import validate_cmd
|
14
14
|
|
15
15
|
__all__ = (
|
16
16
|
"UserRead",
|
@@ -77,14 +77,16 @@ class UserUpdate(schemas.BaseUserUpdate):
|
|
77
77
|
valstr("slurm_user")
|
78
78
|
)
|
79
79
|
_username = validator("username", allow_reuse=True)(valstr("username"))
|
80
|
-
_cache_dir = validator("cache_dir", allow_reuse=True)(
|
81
|
-
val_absolute_path("cache_dir")
|
82
|
-
)
|
83
80
|
|
84
81
|
_slurm_accounts = validator("slurm_accounts", allow_reuse=True)(
|
85
82
|
val_unique_list("slurm_accounts")
|
86
83
|
)
|
87
84
|
|
85
|
+
@validator("cache_dir")
|
86
|
+
def cache_dir_validator(cls, value):
|
87
|
+
validate_cmd(value)
|
88
|
+
return val_absolute_path("cache_dir")(value)
|
89
|
+
|
88
90
|
@validator(
|
89
91
|
"is_active",
|
90
92
|
"is_verified",
|
@@ -115,9 +117,10 @@ class UserUpdateStrict(BaseModel, extra=Extra.forbid):
|
|
115
117
|
val_unique_list("slurm_accounts")
|
116
118
|
)
|
117
119
|
|
118
|
-
|
119
|
-
|
120
|
-
|
120
|
+
@validator("cache_dir")
|
121
|
+
def cache_dir_validator(cls, value):
|
122
|
+
validate_cmd(value)
|
123
|
+
return val_absolute_path("cache_dir")(value)
|
121
124
|
|
122
125
|
|
123
126
|
class UserUpdateWithNewGroupIds(UserUpdate):
|
@@ -157,6 +160,8 @@ class UserCreate(schemas.BaseUserCreate):
|
|
157
160
|
valstr("slurm_user")
|
158
161
|
)
|
159
162
|
_username = validator("username", allow_reuse=True)(valstr("username"))
|
160
|
-
|
161
|
-
|
162
|
-
)
|
163
|
+
|
164
|
+
@validator("cache_dir")
|
165
|
+
def cache_dir_validator(cls, value):
|
166
|
+
validate_cmd(value)
|
167
|
+
return val_absolute_path("cache_dir")(value)
|
@@ -39,14 +39,23 @@ class TaskDumpV2(BaseModel):
|
|
39
39
|
|
40
40
|
|
41
41
|
class WorkflowTaskDumpV2(BaseModel):
|
42
|
+
"""
|
43
|
+
Before v2.5.0, WorkflowTaskV2 could have `task_id=task=None` and
|
44
|
+
non-`None` `task_legacy_id` and `task_legacy`. Since these objects
|
45
|
+
may still exist in the database after version updates, we are setting
|
46
|
+
`task_id` and `task` to `Optional` to avoid response-validation errors
|
47
|
+
for the endpoints that GET datasets.
|
48
|
+
Ref issue #1783.
|
49
|
+
"""
|
50
|
+
|
42
51
|
id: int
|
43
52
|
workflow_id: int
|
44
53
|
order: Optional[int]
|
45
54
|
|
46
55
|
input_filters: Filters
|
47
56
|
|
48
|
-
task_id: int
|
49
|
-
task: TaskDumpV2
|
57
|
+
task_id: Optional[int]
|
58
|
+
task: Optional[TaskDumpV2]
|
50
59
|
|
51
60
|
|
52
61
|
class WorkflowDumpV2(BaseModel, extra=Extra.forbid):
|
@@ -11,6 +11,7 @@ from pydantic import validator
|
|
11
11
|
|
12
12
|
from .._validators import valdictkeys
|
13
13
|
from .._validators import valstr
|
14
|
+
from fractal_server.string_tools import validate_cmd
|
14
15
|
|
15
16
|
|
16
17
|
class TaskCreateV2(BaseModel, extra=Extra.forbid):
|
@@ -43,6 +44,11 @@ class TaskCreateV2(BaseModel, extra=Extra.forbid):
|
|
43
44
|
"Task must have at least one valid command "
|
44
45
|
"(parallel and/or non_parallel)"
|
45
46
|
)
|
47
|
+
if command_parallel is not None:
|
48
|
+
validate_cmd(command_parallel)
|
49
|
+
if command_non_parallel is not None:
|
50
|
+
validate_cmd(command_non_parallel)
|
51
|
+
|
46
52
|
return values
|
47
53
|
|
48
54
|
_name = validator("name", allow_reuse=True)(valstr("name"))
|
fractal_server/ssh/_fabric.py
CHANGED
@@ -17,6 +17,7 @@ from paramiko.ssh_exception import NoValidConnectionsError
|
|
17
17
|
from ..logger import get_logger
|
18
18
|
from ..logger import set_logger
|
19
19
|
from fractal_server.config import get_settings
|
20
|
+
from fractal_server.string_tools import validate_cmd
|
20
21
|
from fractal_server.syringe import Inject
|
21
22
|
|
22
23
|
|
@@ -143,6 +144,7 @@ class FractalSSH(object):
|
|
143
144
|
self,
|
144
145
|
*,
|
145
146
|
cmd: str,
|
147
|
+
allow_char: Optional[str] = None,
|
146
148
|
max_attempts: Optional[int] = None,
|
147
149
|
base_interval: Optional[int] = None,
|
148
150
|
lock_timeout: Optional[int] = None,
|
@@ -152,6 +154,7 @@ class FractalSSH(object):
|
|
152
154
|
|
153
155
|
Args:
|
154
156
|
cmd: Command to be run
|
157
|
+
allow_char: Forbidden chars to allow for this command
|
155
158
|
max_attempts:
|
156
159
|
base_interval:
|
157
160
|
lock_timeout:
|
@@ -159,6 +162,9 @@ class FractalSSH(object):
|
|
159
162
|
Returns:
|
160
163
|
Standard output of the command, if successful.
|
161
164
|
"""
|
165
|
+
|
166
|
+
validate_cmd(cmd, allow_char=allow_char)
|
167
|
+
|
162
168
|
actual_max_attempts = self.default_max_attempts
|
163
169
|
if max_attempts is not None:
|
164
170
|
actual_max_attempts = max_attempts
|
fractal_server/string_tools.py
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
import string
|
2
|
+
from typing import Optional
|
2
3
|
|
3
4
|
__SPECIAL_CHARACTERS__ = f"{string.punctuation}{string.whitespace}"
|
4
5
|
|
6
|
+
# List of invalid characters discussed here:
|
7
|
+
# https://github.com/fractal-analytics-platform/fractal-server/issues/1647
|
8
|
+
__NOT_ALLOWED_FOR_COMMANDS__ = r"`#$&*()\|[]{};<>?!"
|
9
|
+
|
5
10
|
|
6
11
|
def sanitize_string(value: str) -> str:
|
7
12
|
"""
|
@@ -43,3 +48,23 @@ def slugify_task_name_for_source(task_name: str) -> str:
|
|
43
48
|
Slug-ified task name.
|
44
49
|
"""
|
45
50
|
return task_name.replace(" ", "_").lower()
|
51
|
+
|
52
|
+
|
53
|
+
def validate_cmd(command: str, allow_char: Optional[str] = None):
|
54
|
+
"""
|
55
|
+
Assert that the provided `command` does not contain any of the forbidden
|
56
|
+
characters for commands
|
57
|
+
(fractal_server.string_tools.__NOT_ALLOWED_FOR_COMMANDS__)
|
58
|
+
|
59
|
+
Args:
|
60
|
+
command: command to validate.
|
61
|
+
allow_char: chars to accept among the forbidden ones
|
62
|
+
"""
|
63
|
+
forbidden = set(__NOT_ALLOWED_FOR_COMMANDS__)
|
64
|
+
if allow_char is not None:
|
65
|
+
forbidden = forbidden - set(allow_char)
|
66
|
+
if not forbidden.isdisjoint(set(command)):
|
67
|
+
raise ValueError(
|
68
|
+
f"Command must not contain any of this characters: '{forbidden}'\n"
|
69
|
+
f"Provided command: '{command}'."
|
70
|
+
)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
fractal_server/__init__.py,sha256=
|
1
|
+
fractal_server/__init__.py,sha256=8LAfKcNqeSASwVPDsGBZzXPzRTZGKfeNUwe56FocjrA,22
|
2
2
|
fractal_server/__main__.py,sha256=upYBkGYrkBnkS1rp4D_nb_1LS37QT4j-wxGX1ZMvR4A,5704
|
3
3
|
fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
|
4
4
|
fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -46,7 +46,7 @@ fractal_server/app/routes/api/v2/status.py,sha256=6N9DSZ4iFqbZImorWfEAPoyoFUgEru
|
|
46
46
|
fractal_server/app/routes/api/v2/submit.py,sha256=iTGCYbxiZNszHQa8r3gmAR4QcF6QhVrb8ktzste2Ovc,8775
|
47
47
|
fractal_server/app/routes/api/v2/task.py,sha256=XgRnGBvSoI9VNJHtWZQ2Ide99f6elo7a2FN3GQkf0dU,8376
|
48
48
|
fractal_server/app/routes/api/v2/task_collection.py,sha256=wEwP8VfsxhKPZ6K3v1Bnput_Zw0Cjhlaal0-e50feIQ,12337
|
49
|
-
fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=
|
49
|
+
fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=CbeC7xYYF8K9JVOOunL3Y_3wXBEGGGoiJcoPa2hEftI,6127
|
50
50
|
fractal_server/app/routes/api/v2/workflow.py,sha256=rMCcclz9aJAMSVLncUdSDGrgkKbn4KOCZTqZtqs2HDY,10428
|
51
51
|
fractal_server/app/routes/api/v2/workflowtask.py,sha256=-3-c8DDnxGjMwWbX_h5V5OLaC_iCLXYzwWKBUaL-5wE,7060
|
52
52
|
fractal_server/app/routes/auth/__init__.py,sha256=fao6CS0WiAjHDTvBzgBVV_bSXFpEAeDBF6Z6q7rRkPc,1658
|
@@ -66,7 +66,7 @@ fractal_server/app/runner/.gitignore,sha256=ytzN_oyHWXrGU7iFAtoHSTUbM6Rn6kG0Zkdd
|
|
66
66
|
fractal_server/app/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
67
67
|
fractal_server/app/runner/async_wrap.py,sha256=_O6f8jftKYXG_DozkmlrDBhoiK9QhE9MablOyECq2_M,829
|
68
68
|
fractal_server/app/runner/components.py,sha256=ZF8ct_Ky5k8IAcrmpYOZ-bc6OBgdELEighYVqFDEbZg,119
|
69
|
-
fractal_server/app/runner/compress_folder.py,sha256=
|
69
|
+
fractal_server/app/runner/compress_folder.py,sha256=HSc1tv7x2DBjBoXwugZlC79rm9GNBIWtQKK9yWn5ZBI,3991
|
70
70
|
fractal_server/app/runner/exceptions.py,sha256=_qZ_t8O4umAdJ1ikockiF5rDJuxnEskrGrLjZcnQl7A,4159
|
71
71
|
fractal_server/app/runner/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
72
72
|
fractal_server/app/runner/executors/slurm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -80,16 +80,16 @@ fractal_server/app/runner/executors/slurm/ssh/executor.py,sha256=oCc5cLZoNmJ3ENV
|
|
80
80
|
fractal_server/app/runner/executors/slurm/sudo/__init__.py,sha256=Cjn1rYvljddi96tAwS-qqGkNfOcfPzjChdaEZEObCcM,65
|
81
81
|
fractal_server/app/runner/executors/slurm/sudo/_check_jobs_status.py,sha256=wAgwpVcr6JIslKHOuS0FhRa_6T1KCManyRJqA-fifzw,1909
|
82
82
|
fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py,sha256=z5LlhaiqAb8pHsF1WwdzXN39C5anQmwjo1rSQgtRAYE,4422
|
83
|
-
fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py,sha256=
|
84
|
-
fractal_server/app/runner/executors/slurm/sudo/executor.py,sha256=
|
83
|
+
fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py,sha256=g8wqUjSicN17UZVXlfaMomYZ-xOIbBu1oE7HdJTzfvw,5218
|
84
|
+
fractal_server/app/runner/executors/slurm/sudo/executor.py,sha256=FXf9I-12C3bnP20OMTdxwnBVpniluEf4V6V2Y3QVStk,48594
|
85
85
|
fractal_server/app/runner/extract_archive.py,sha256=tLpjDrX47OjTNhhoWvm6iNukg8KoieWyTb7ZfvE9eWU,2483
|
86
86
|
fractal_server/app/runner/filenames.py,sha256=9lwu3yB4C67yiijYw8XIKaLFn3mJUt6_TCyVFM_aZUQ,206
|
87
|
-
fractal_server/app/runner/run_subprocess.py,sha256=
|
87
|
+
fractal_server/app/runner/run_subprocess.py,sha256=c3JbYXq3hX2aaflQU19qJ5Xs6J6oXGNvnTEoAfv2bxc,959
|
88
88
|
fractal_server/app/runner/set_start_and_last_task_index.py,sha256=-q4zVybAj8ek2XlbENKlfOAJ39hT_zoJoZkqzDqiAMY,1254
|
89
89
|
fractal_server/app/runner/shutdown.py,sha256=I_o2iYKJwzku0L3E85ETjrve3QPECygR5xhhsAo5huM,2910
|
90
90
|
fractal_server/app/runner/task_files.py,sha256=sd_MpJ01C8c9QTO8GzGMidFGdlq_hXX_ARDRhd_YMnI,3762
|
91
91
|
fractal_server/app/runner/v1/__init__.py,sha256=VvJFk4agX2X3fQfDcoNmOB2ouNCaQU7dAqaFmpcdP8I,15063
|
92
|
-
fractal_server/app/runner/v1/_common.py,sha256=
|
92
|
+
fractal_server/app/runner/v1/_common.py,sha256=EiSfp-PvhtTD3uijSec5CNKxe50ITts2DyGCFcjfVBw,21619
|
93
93
|
fractal_server/app/runner/v1/_local/__init__.py,sha256=KlSML4LqF4p1IfhSd8tAkiu3aeDzifeanuNXjATDsYE,6929
|
94
94
|
fractal_server/app/runner/v1/_local/_local_config.py,sha256=hM7SPxR07luXPcXdrWXRpEB2uOyjSSRUdqW3QBKJn9c,3147
|
95
95
|
fractal_server/app/runner/v1/_local/_submit_setup.py,sha256=XyBDPb4IYdKEEnzLYdcYteIHWVWofJxKMmQCyRkn5Bc,1509
|
@@ -119,12 +119,12 @@ fractal_server/app/runner/v2/handle_failed_job.py,sha256=fipRJT5Y8UY0US4bXUX-4OR
|
|
119
119
|
fractal_server/app/runner/v2/merge_outputs.py,sha256=IHuHqbKmk97K35BFvTrKVBs60z3e_--OzXTnsvmA02c,1281
|
120
120
|
fractal_server/app/runner/v2/runner.py,sha256=nw9oYt3cFItHWVoevJyMI63K0kWHCTAriAQ_KINo_F8,13039
|
121
121
|
fractal_server/app/runner/v2/runner_functions.py,sha256=BLREIcQaE6FSc2AEJyZuiYk6rGazEz_9gprUqUZDljs,9488
|
122
|
-
fractal_server/app/runner/v2/runner_functions_low_level.py,sha256=
|
122
|
+
fractal_server/app/runner/v2/runner_functions_low_level.py,sha256=1fWvQ6YZUUnDhO_mipXC5hnaT-zK-GHxg8ayoxZX82k,3648
|
123
123
|
fractal_server/app/runner/v2/task_interface.py,sha256=myS-kT0DsJ8xIJZBVEzgD8g54VbiwL6i7Im3e1zcVHQ,1866
|
124
124
|
fractal_server/app/runner/versions.py,sha256=dSaPRWqmFPHjg20kTCHmi_dmGNcCETflDtDLronNanU,852
|
125
125
|
fractal_server/app/schemas/__init__.py,sha256=jiIf54owztXupv3PO6Ilh0qcrkh2RUzKq4bcEFqEfc4,40
|
126
126
|
fractal_server/app/schemas/_validators.py,sha256=1dTOYr1IZykrxuQSV2-zuEMZbKe_nGwrfS7iUrsh-sE,3461
|
127
|
-
fractal_server/app/schemas/user.py,sha256=
|
127
|
+
fractal_server/app/schemas/user.py,sha256=OJutfwMR1JPEmdFzqA4vHMZO-mhB4Mb9Yyx_G24XTCM,4081
|
128
128
|
fractal_server/app/schemas/user_group.py,sha256=2f9XQ6kIar6NMY4UCN0yOnve6ZDHUVZaHv1dna1Vfjg,1446
|
129
129
|
fractal_server/app/schemas/v1/__init__.py,sha256=CrBGgBhoemCvmZ70ZUchM-jfVAICnoa7AjZBAtL2UB0,1852
|
130
130
|
fractal_server/app/schemas/v1/applyworkflow.py,sha256=uuIh7fHlHEL4yLqL-dePI6-nfCsqgBYATmht7w_KITw,4302
|
@@ -138,12 +138,12 @@ fractal_server/app/schemas/v1/task_collection.py,sha256=uvq9bcMaGD_qHsh7YtcpoSAk
|
|
138
138
|
fractal_server/app/schemas/v1/workflow.py,sha256=tuOs5E5Q_ozA8if7YPZ07cQjzqB_QMkBS4u92qo4Ro0,4618
|
139
139
|
fractal_server/app/schemas/v2/__init__.py,sha256=kmM4NfSGIL0I4xVtnmMST20kfVo3nBBG-Ssk8vJAvLs,1979
|
140
140
|
fractal_server/app/schemas/v2/dataset.py,sha256=dLT52tV4dSf2HrFNak4vdQEn8PT_04IUrGnd2z-AXIU,2599
|
141
|
-
fractal_server/app/schemas/v2/dumps.py,sha256=
|
141
|
+
fractal_server/app/schemas/v2/dumps.py,sha256=ZrJCHTv9oU2QMNjPUSBO3DIPRO3qDvbxpAGpernpf-Q,1720
|
142
142
|
fractal_server/app/schemas/v2/job.py,sha256=zfF9K3v4jWUJ7M482ta2CkqUJ4tVT4XfVt60p9IRhP0,3250
|
143
143
|
fractal_server/app/schemas/v2/manifest.py,sha256=N37IWohcfO3_y2l8rVM0h_1nZq7m4Izxk9iL1vtwBJw,6243
|
144
144
|
fractal_server/app/schemas/v2/project.py,sha256=u7S4B-bote1oGjzAGiZ-DuQIyeRAGqJsI71Tc1EtYE0,736
|
145
145
|
fractal_server/app/schemas/v2/status.py,sha256=SQaUpQkjFq5c5k5J4rOjNhuQaDOEg8lksPhkKmPU5VU,332
|
146
|
-
fractal_server/app/schemas/v2/task.py,sha256=
|
146
|
+
fractal_server/app/schemas/v2/task.py,sha256=XsN8w1Szs8BrxxRtKyWCHKjN4Od-Kmlhi769JEplL-M,4804
|
147
147
|
fractal_server/app/schemas/v2/task_collection.py,sha256=8PG1bOqkfQqORMN0brWf6mHDmijt0bBW-mZsF7cSxUs,6129
|
148
148
|
fractal_server/app/schemas/v2/workflow.py,sha256=Zzx3e-qgkH8le0FUmAx9UrV5PWd7bj14PPXUh_zgZXM,1827
|
149
149
|
fractal_server/app/schemas/v2/workflowtask.py,sha256=TN-mdkuE_EWet9Wk-xFrUwIt_tXYcw88WOKMnUcchKk,5665
|
@@ -181,8 +181,8 @@ fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py
|
|
181
181
|
fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py,sha256=9BwqUS9Gf7UW_KjrzHbtViC880qhD452KAytkHWWZyk,746
|
182
182
|
fractal_server/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
183
183
|
fractal_server/ssh/__init__.py,sha256=sVUmzxf7_DuXG1xoLQ1_00fo5NPhi2LJipSmU5EAkPs,124
|
184
|
-
fractal_server/ssh/_fabric.py,sha256=
|
185
|
-
fractal_server/string_tools.py,sha256=
|
184
|
+
fractal_server/ssh/_fabric.py,sha256=wJFgdBZ_-Zs1FbHJ7sqqkx--1BVJhZIMEk-s_CKPY20,11591
|
185
|
+
fractal_server/string_tools.py,sha256=YyopB2ZZ8iL9JLDXUA8PI0hahivqLiohir2HsAlEzqE,2170
|
186
186
|
fractal_server/syringe.py,sha256=3qSMW3YaMKKnLdgnooAINOPxnCOxP7y2jeAQYB21Gdo,2786
|
187
187
|
fractal_server/tasks/__init__.py,sha256=kadmVUoIghl8s190_Tt-8f-WBqMi8u8oU4Pvw39NHE8,23
|
188
188
|
fractal_server/tasks/utils.py,sha256=wucz57I7G0Vd8hvtmvonlryACx9zIVlqfxG5I87MJ80,1820
|
@@ -207,8 +207,8 @@ fractal_server/tasks/v2/utils.py,sha256=JOyCacb6MNvrwfLNTyLwcz8y79J29YuJeJ2MK5kq
|
|
207
207
|
fractal_server/urls.py,sha256=5o_qq7PzKKbwq12NHSQZDmDitn5RAOeQ4xufu-2v9Zk,448
|
208
208
|
fractal_server/utils.py,sha256=b7WwFdcFZ8unyT65mloFToYuEDXpQoHRcmRNqrhd_dQ,2115
|
209
209
|
fractal_server/zip_tools.py,sha256=xYpzBshysD2nmxkD5WLYqMzPYUcCRM3kYy-7n9bJL-U,4426
|
210
|
-
fractal_server-2.5.
|
211
|
-
fractal_server-2.5.
|
212
|
-
fractal_server-2.5.
|
213
|
-
fractal_server-2.5.
|
214
|
-
fractal_server-2.5.
|
210
|
+
fractal_server-2.5.1.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
|
211
|
+
fractal_server-2.5.1.dist-info/METADATA,sha256=PERWmLEehrxcMRZM1CCRADi950e6Pa-ofw7tnwgyqXw,4628
|
212
|
+
fractal_server-2.5.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
213
|
+
fractal_server-2.5.1.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
|
214
|
+
fractal_server-2.5.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|