ominfra 0.0.0.dev356__tar.gz → 0.0.0.dev358__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.
- {ominfra-0.0.0.dev356/ominfra.egg-info → ominfra-0.0.0.dev358}/PKG-INFO +3 -3
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/commands/injection.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/commands/local.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/commands/marshal.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/commands/subprocess.py +42 -4
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/apps.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/conf/inject.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/injection.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/nginx.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/paths/inject.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/paths/manager.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/paths/owners.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/paths/specs.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/systemd.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/tmp.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/venvs.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/remote/config.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/remote/connection.py +1 -1
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/remote/payload.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/remote/spawning.py +1 -1
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/system/config.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/system/inject.py +3 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/system/packages.py +4 -1
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/targets/connection.py +1 -1
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/pyremote.py +10 -4
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/scripts/journald2aws.py +1 -1
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/scripts/manage.py +247 -18
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/scripts/supervisor.py +1 -1
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358/ominfra.egg-info}/PKG-INFO +3 -3
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra.egg-info/requires.txt +2 -2
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/pyproject.toml +3 -3
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/LICENSE +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/MANIFEST.in +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/README.md +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/.manifests.json +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/__about__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/__main__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/auth.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/cli.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/dataclasses.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/instancetypes/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/instancetypes/__main__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/instancetypes/cache.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/instancetypes/cli.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/journald2aws/main.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/logs.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/metadata.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/base.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/gen/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/gen/__main__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/gen/cli.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/gen/gen.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/services/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/services/ec2.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/services/lambda_.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/services/rds.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/services/s3.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/aws/models/services/services.toml +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/gcp/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/gcp/api.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/clouds/gcp/auth.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/commands/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/commands/runners.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/commands/ssh.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/journald/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/journald/fields.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/journald/genmessages.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/journald/messages.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/journald/tailer.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/__main__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/bootstrap.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/bootstrap_.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/commands/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/commands/base.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/commands/inject.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/commands/ping.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/commands/types.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/config.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/commands.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/conf/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/conf/manager.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/conf/specs.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/config.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/deploy.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/git.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/inject.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/interp.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/paths/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/paths/paths.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/paths/types.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/specs.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/tags.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/deploy/types.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/inject.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/main.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/marshal.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/remote/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/remote/_main.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/remote/channel.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/remote/execution.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/remote/inject.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/system/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/system/commands.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/system/platforms.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/targets/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/targets/bestpython.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/targets/bestpython.sh +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/targets/inject.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/manage/targets/targets.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/scripts/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/LICENSE.txt +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/__main__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/configs.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/dispatchers.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/dispatchersimpl.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/errors.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/events.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/groups.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/groupsimpl.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/http.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/inject.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/io.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/main.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/pipes.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/privileges.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/process.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/processimpl.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/setup.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/setupimpl.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/signals.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/spawning.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/spawningimpl.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/states.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/supervisor.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/types.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/utils/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/utils/collections.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/utils/diag.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/utils/fds.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/utils/fs.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/utils/os.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/utils/ostypes.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/utils/signals.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/utils/strings.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/supervisor/utils/users.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/systemd.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/tailscale/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/tailscale/api.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/tailscale/cli.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/threadworkers.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/tools/__init__.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra/tools/listresources.py +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra.egg-info/SOURCES.txt +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra.egg-info/dependency_links.txt +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra.egg-info/entry_points.txt +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/ominfra.egg-info/top_level.txt +0 -0
- {ominfra-0.0.0.dev356 → ominfra-0.0.0.dev358}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ominfra
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev358
|
4
4
|
Summary: ominfra
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -12,8 +12,8 @@ Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Operating System :: POSIX
|
13
13
|
Requires-Python: >=3.13
|
14
14
|
License-File: LICENSE
|
15
|
-
Requires-Dist: omdev==0.0.0.
|
16
|
-
Requires-Dist: omlish==0.0.0.
|
15
|
+
Requires-Dist: omdev==0.0.0.dev358
|
16
|
+
Requires-Dist: omlish==0.0.0.dev358
|
17
17
|
Provides-Extra: all
|
18
18
|
Requires-Dist: paramiko~=3.5; extra == "all"
|
19
19
|
Requires-Dist: asyncssh~=2.21; extra == "all"
|
@@ -28,13 +28,26 @@ class SubprocessCommand(Command['SubprocessCommand.Output']):
|
|
28
28
|
env: ta.Optional[ta.Mapping[str, str]] = None
|
29
29
|
|
30
30
|
stdout: str = 'pipe' # SubprocessChannelOption
|
31
|
+
decode_stdout: ta.Optional[str] = None
|
32
|
+
|
31
33
|
stderr: str = 'pipe' # SubprocessChannelOption
|
34
|
+
decode_stderr: ta.Optional[str] = None
|
32
35
|
|
33
36
|
input: ta.Optional[bytes] = None
|
37
|
+
encode_input: ta.Optional[str] = None
|
38
|
+
input_str: ta.Optional[str] = None
|
39
|
+
|
34
40
|
timeout: ta.Optional[float] = None
|
35
41
|
|
36
42
|
def __post_init__(self) -> None:
|
37
43
|
check.not_isinstance(self.cmd, str)
|
44
|
+
check.state(not (self.input is not None and self.input_str is not None))
|
45
|
+
if self.decode_stdout is not None:
|
46
|
+
check.non_empty_str(self.decode_stdout)
|
47
|
+
if self.decode_stderr is not None:
|
48
|
+
check.non_empty_str(self.decode_stderr)
|
49
|
+
if self.encode_input is not None:
|
50
|
+
check.non_empty_str(self.encode_input)
|
38
51
|
|
39
52
|
@dc.dataclass(frozen=True)
|
40
53
|
class Output(Command.Output):
|
@@ -44,11 +57,25 @@ class SubprocessCommand(Command['SubprocessCommand.Output']):
|
|
44
57
|
elapsed_s: float
|
45
58
|
|
46
59
|
stdout: ta.Optional[bytes] = None
|
60
|
+
stdout_str: ta.Optional[str] = None
|
61
|
+
|
47
62
|
stderr: ta.Optional[bytes] = None
|
63
|
+
stderr_str: ta.Optional[str] = None
|
48
64
|
|
49
65
|
|
50
66
|
class SubprocessCommandExecutor(CommandExecutor[SubprocessCommand, SubprocessCommand.Output]):
|
67
|
+
DEFAULT_INPUT_ENCODING: ta.ClassVar[str] = 'utf-8'
|
68
|
+
|
51
69
|
async def execute(self, cmd: SubprocessCommand) -> SubprocessCommand.Output:
|
70
|
+
input_bytes: ta.Optional[bytes]
|
71
|
+
if cmd.input is not None:
|
72
|
+
check.none(cmd.input_str)
|
73
|
+
input_bytes = cmd.input
|
74
|
+
elif cmd.input_str is not None:
|
75
|
+
input_bytes = cmd.input_str.encode(cmd.encode_input or self.DEFAULT_INPUT_ENCODING)
|
76
|
+
else:
|
77
|
+
input_bytes = None
|
78
|
+
|
52
79
|
proc: asyncio.subprocess.Process
|
53
80
|
async with asyncio_subprocesses.popen(
|
54
81
|
*subprocess_maybe_shell_wrap_exec(*cmd.cmd),
|
@@ -57,7 +84,7 @@ class SubprocessCommandExecutor(CommandExecutor[SubprocessCommand, SubprocessCom
|
|
57
84
|
cwd=cmd.cwd,
|
58
85
|
env={**os.environ, **(cmd.env or {})},
|
59
86
|
|
60
|
-
stdin=subprocess.PIPE if
|
87
|
+
stdin=subprocess.PIPE if input_bytes is not None else None,
|
61
88
|
stdout=SUBPROCESS_CHANNEL_OPTION_VALUES[ta.cast(SubprocessChannelOption, cmd.stdout)],
|
62
89
|
stderr=SUBPROCESS_CHANNEL_OPTION_VALUES[ta.cast(SubprocessChannelOption, cmd.stderr)],
|
63
90
|
|
@@ -66,17 +93,28 @@ class SubprocessCommandExecutor(CommandExecutor[SubprocessCommand, SubprocessCom
|
|
66
93
|
start_time = time.time()
|
67
94
|
stdout, stderr = await asyncio_subprocesses.communicate(
|
68
95
|
proc,
|
69
|
-
input=
|
96
|
+
input=input,
|
70
97
|
timeout=cmd.timeout,
|
71
98
|
)
|
72
99
|
end_time = time.time()
|
73
100
|
|
101
|
+
out_kw: ta.Dict[str, ta.Any] = {}
|
102
|
+
if stdout is not None:
|
103
|
+
if cmd.decode_stdout is not None:
|
104
|
+
out_kw.update(stdout_str=stdout.decode(cmd.decode_stdout))
|
105
|
+
else:
|
106
|
+
out_kw.update(stdout=stdout)
|
107
|
+
if stderr is not None:
|
108
|
+
if cmd.decode_stderr is not None:
|
109
|
+
out_kw.update(stderr_str=stderr.decode(cmd.decode_stderr))
|
110
|
+
else:
|
111
|
+
out_kw.update(stderr=stderr)
|
112
|
+
|
74
113
|
return SubprocessCommand.Output(
|
75
114
|
rc=check.not_none(proc.returncode),
|
76
115
|
pid=proc.pid,
|
77
116
|
|
78
117
|
elapsed_s=end_time - start_time,
|
79
118
|
|
80
|
-
|
81
|
-
stderr=stderr, # noqa
|
119
|
+
**out_kw,
|
82
120
|
)
|
@@ -13,7 +13,10 @@ from omlish.asyncs.asyncio.subprocesses import asyncio_subprocesses
|
|
13
13
|
from omlish.lite.check import check
|
14
14
|
|
15
15
|
|
16
|
-
SystemPackageOrStr = ta.Union['SystemPackage', str]
|
16
|
+
SystemPackageOrStr = ta.Union['SystemPackage', str] # ta.TypeAlias
|
17
|
+
|
18
|
+
|
19
|
+
##
|
17
20
|
|
18
21
|
|
19
22
|
@dc.dataclass(frozen=True)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# ruff: noqa: UP006 UP007 UP045
|
1
|
+
# ruff: noqa: UP006 UP007 UP043 UP045
|
2
2
|
# @omlish-lite
|
3
3
|
"""
|
4
4
|
Basically this: https://mitogen.networkgenomics.com/howitworks.html
|
@@ -438,15 +438,21 @@ class PyremoteBootstrapDriver:
|
|
438
438
|
if isinstance(payload_src, str):
|
439
439
|
parts = [payload_src]
|
440
440
|
else:
|
441
|
-
parts =
|
441
|
+
parts = []
|
442
|
+
for i, p in enumerate(payload_src):
|
443
|
+
if i:
|
444
|
+
parts.append('\n\n')
|
445
|
+
parts.append(p)
|
442
446
|
|
443
447
|
if (mn := options.main_name_override) is not None:
|
444
|
-
|
448
|
+
# Must go on same single line as first line of user payload to preserve '<stdin>' line numbers. If more
|
449
|
+
# things wind up having to be done here, it can still be crammed on one line into a single `exec()`.
|
450
|
+
parts.insert(0, f'__name__ = {mn!r}; ')
|
445
451
|
|
446
452
|
if len(parts) == 1:
|
447
453
|
return parts[0]
|
448
454
|
else:
|
449
|
-
return '
|
455
|
+
return ''.join(parts)
|
450
456
|
|
451
457
|
#
|
452
458
|
|