ominfra 0.0.0.dev295__tar.gz → 0.0.0.dev297__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.dev295/ominfra.egg-info → ominfra-0.0.0.dev297}/PKG-INFO +3 -3
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/gen/gen.py +20 -1
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/ec2.py +4 -4
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/pyremote.py +59 -67
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/scripts/manage.py +65 -69
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297/ominfra.egg-info}/PKG-INFO +3 -3
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra.egg-info/requires.txt +2 -2
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/pyproject.toml +3 -3
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/LICENSE +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/MANIFEST.in +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/README.md +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/.manifests.json +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/__about__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/__main__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/auth.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/cli.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/dataclasses.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/instancetypes/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/instancetypes/__main__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/instancetypes/cache.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/instancetypes/cli.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/main.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/logs.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/metadata.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/base.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/gen/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/gen/__main__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/gen/cli.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/lambda_.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/rds.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/s3.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/aws/models/services/services.toml +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/gcp/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/gcp/api.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/clouds/gcp/auth.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/commands/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/commands/runners.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/commands/ssh.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/journald/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/journald/fields.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/journald/genmessages.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/journald/messages.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/journald/tailer.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/__main__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/bootstrap.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/bootstrap_.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/base.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/inject.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/injection.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/local.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/marshal.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/ping.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/subprocess.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/commands/types.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/config.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/apps.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/commands.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/conf/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/conf/inject.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/conf/manager.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/conf/specs.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/config.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/deploy.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/git.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/inject.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/injection.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/interp.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/nginx.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/inject.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/manager.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/owners.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/paths.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/specs.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/paths/types.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/specs.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/systemd.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/tags.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/tmp.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/types.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/deploy/venvs.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/inject.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/main.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/marshal.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/_main.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/channel.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/config.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/connection.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/execution.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/inject.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/payload.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/remote/spawning.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/commands.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/config.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/inject.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/packages.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/system/platforms.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/bestpython.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/bestpython.sh +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/connection.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/inject.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/manage/targets/targets.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/scripts/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/scripts/journald2aws.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/scripts/supervisor.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/LICENSE.txt +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/__main__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/configs.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/dispatchers.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/dispatchersimpl.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/errors.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/events.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/groups.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/groupsimpl.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/http.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/inject.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/io.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/main.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/pipes.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/privileges.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/process.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/processimpl.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/setup.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/setupimpl.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/signals.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/spawning.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/spawningimpl.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/states.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/supervisor.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/types.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/collections.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/diag.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/fds.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/fs.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/os.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/ostypes.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/signals.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/strings.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/supervisor/utils/users.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/systemd.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/tailscale/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/tailscale/api.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/tailscale/cli.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/threadworkers.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/tools/__init__.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra/tools/listresources.py +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra.egg-info/SOURCES.txt +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra.egg-info/dependency_links.txt +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra.egg-info/entry_points.txt +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/ominfra.egg-info/top_level.txt +0 -0
- {ominfra-0.0.0.dev295 → ominfra-0.0.0.dev297}/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.dev297
|
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.12
|
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.dev297
|
16
|
+
Requires-Dist: omlish==0.0.0.dev297
|
17
17
|
Provides-Extra: all
|
18
18
|
Requires-Dist: paramiko~=3.5; extra == "all"
|
19
19
|
Requires-Dist: asyncssh~=2.20; extra == "all"
|
@@ -194,6 +194,19 @@ class ModelGen:
|
|
194
194
|
|
195
195
|
#
|
196
196
|
|
197
|
+
NAME_REPLACEMENTS: ta.ClassVar[ta.Sequence[tuple[str, str]]] = [
|
198
|
+
*[
|
199
|
+
(p + l, p + r)
|
200
|
+
for p in 'KMGTP '
|
201
|
+
for l, r in [
|
202
|
+
('bps', 'bips'),
|
203
|
+
('Bps', 'bps'),
|
204
|
+
('ibps', 'ibips'),
|
205
|
+
('iBps', 'ibps'),
|
206
|
+
]
|
207
|
+
],
|
208
|
+
]
|
209
|
+
|
197
210
|
DEMANGLE_PREFIXES: ta.ClassVar[ta.Sequence[str]] = [
|
198
211
|
|
199
212
|
'AAAA',
|
@@ -217,7 +230,6 @@ class ModelGen:
|
|
217
230
|
'IP',
|
218
231
|
'JSON',
|
219
232
|
'KMS',
|
220
|
-
'MBps',
|
221
233
|
'MD5',
|
222
234
|
'MFA',
|
223
235
|
'NVME',
|
@@ -230,6 +242,9 @@ class ModelGen:
|
|
230
242
|
]
|
231
243
|
|
232
244
|
def demangle_name(self, n: str) -> str:
|
245
|
+
for l, r in self.NAME_REPLACEMENTS:
|
246
|
+
n = n.replace(l, r)
|
247
|
+
|
233
248
|
ps: list[str] = []
|
234
249
|
while n:
|
235
250
|
ms: list[tuple[str, int]] = []
|
@@ -334,6 +349,8 @@ class ModelGen:
|
|
334
349
|
lines.append(' pass')
|
335
350
|
|
336
351
|
ms: botocore.model.Shape
|
352
|
+
seen_fns: set[str] = set()
|
353
|
+
|
337
354
|
for i, (mn, ms) in enumerate(shape.members.items()):
|
338
355
|
mds = [
|
339
356
|
f'member_name={mn!r}',
|
@@ -381,6 +398,8 @@ class ModelGen:
|
|
381
398
|
fd = 'default=None, '
|
382
399
|
|
383
400
|
fn = self.sanitize_local_name(self.demangle_name(mn))
|
401
|
+
check.not_in(fn, seen_fns)
|
402
|
+
seen_fns.add(fn)
|
384
403
|
|
385
404
|
fls = [
|
386
405
|
f'{fn}: {fa} = _dc.field({fd}metadata=_base.field_metadata(',
|
@@ -2274,7 +2274,7 @@ class EbsOptimizedInfo(
|
|
2274
2274
|
_base.Shape,
|
2275
2275
|
shape_name='EbsOptimizedInfo',
|
2276
2276
|
):
|
2277
|
-
|
2277
|
+
baseline_bandwidth_in_mbips: BaselineBandwidthInMbps | None = _dc.field(default=None, metadata=_base.field_metadata(
|
2278
2278
|
member_name='BaselineBandwidthInMbps',
|
2279
2279
|
serialization_name='baselineBandwidthInMbps',
|
2280
2280
|
shape_name='BaselineBandwidthInMbps',
|
@@ -2292,7 +2292,7 @@ class EbsOptimizedInfo(
|
|
2292
2292
|
shape_name='BaselineIops',
|
2293
2293
|
))
|
2294
2294
|
|
2295
|
-
|
2295
|
+
maximum_bandwidth_in_mbips: MaximumBandwidthInMbps | None = _dc.field(default=None, metadata=_base.field_metadata(
|
2296
2296
|
member_name='MaximumBandwidthInMbps',
|
2297
2297
|
serialization_name='maximumBandwidthInMbps',
|
2298
2298
|
shape_name='MaximumBandwidthInMbps',
|
@@ -3059,13 +3059,13 @@ class NetworkCardInfo(
|
|
3059
3059
|
shape_name='MaxNetworkInterfaces',
|
3060
3060
|
))
|
3061
3061
|
|
3062
|
-
|
3062
|
+
baseline_bandwidth_in_gbips: BaselineBandwidthInGbps | None = _dc.field(default=None, metadata=_base.field_metadata(
|
3063
3063
|
member_name='BaselineBandwidthInGbps',
|
3064
3064
|
serialization_name='baselineBandwidthInGbps',
|
3065
3065
|
shape_name='BaselineBandwidthInGbps',
|
3066
3066
|
))
|
3067
3067
|
|
3068
|
-
|
3068
|
+
peak_bandwidth_in_gbips: PeakBandwidthInGbps | None = _dc.field(default=None, metadata=_base.field_metadata(
|
3069
3069
|
member_name='PeakBandwidthInGbps',
|
3070
3070
|
serialization_name='peakBandwidthInGbps',
|
3071
3071
|
shape_name='PeakBandwidthInGbps',
|
@@ -185,29 +185,33 @@ def _get_pyremote_env_info() -> PyremoteEnvInfo:
|
|
185
185
|
##
|
186
186
|
|
187
187
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
'
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
188
|
+
class _PyremoteBootstrapConsts:
|
189
|
+
def __new__(cls, *args, **kwargs): # noqa
|
190
|
+
raise TypeError
|
191
|
+
|
192
|
+
INPUT_FD = 100
|
193
|
+
SRC_FD = 101
|
194
|
+
|
195
|
+
CHILD_PID_VAR = '_OPYR_CHILD_PID'
|
196
|
+
ARGV0_VAR = '_OPYR_ARGV0'
|
197
|
+
CONTEXT_NAME_VAR = '_OPYR_CONTEXT_NAME'
|
198
|
+
SRC_FILE_VAR = '_OPYR_SRC_FILE'
|
199
|
+
OPTIONS_JSON_VAR = '_OPYR_OPTIONS_JSON'
|
200
|
+
|
201
|
+
ACK0 = b'OPYR000\n'
|
202
|
+
ACK1 = b'OPYR001\n'
|
203
|
+
ACK2 = b'OPYR002\n'
|
204
|
+
ACK3 = b'OPYR003\n'
|
205
|
+
|
206
|
+
PROC_TITLE_FMT = '(pyremote:%s)'
|
207
|
+
|
208
|
+
IMPORTS = (
|
209
|
+
'base64',
|
210
|
+
'os',
|
211
|
+
'struct',
|
212
|
+
'sys',
|
213
|
+
'zlib',
|
214
|
+
)
|
211
215
|
|
212
216
|
|
213
217
|
def _pyremote_bootstrap_main(context_name: str) -> None:
|
@@ -222,13 +226,13 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
|
|
222
226
|
# Parent process
|
223
227
|
|
224
228
|
# Dup original stdin to comm_fd for use as comm channel
|
225
|
-
os.dup2(0,
|
229
|
+
os.dup2(0, _PyremoteBootstrapConsts.INPUT_FD)
|
226
230
|
|
227
231
|
# Overwrite stdin (fed to python repl) with first copy of src
|
228
232
|
os.dup2(r0, 0)
|
229
233
|
|
230
234
|
# Dup second copy of src to src_fd to recover after launch
|
231
|
-
os.dup2(r1,
|
235
|
+
os.dup2(r1, _PyremoteBootstrapConsts.SRC_FD)
|
232
236
|
|
233
237
|
# Close remaining fd's
|
234
238
|
for f in [r0, w0, r1, w1]:
|
@@ -237,18 +241,18 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
|
|
237
241
|
# Save vars
|
238
242
|
env = os.environ
|
239
243
|
exe = sys.executable
|
240
|
-
env[
|
241
|
-
env[
|
242
|
-
env[
|
244
|
+
env[_PyremoteBootstrapConsts.CHILD_PID_VAR] = str(cp)
|
245
|
+
env[_PyremoteBootstrapConsts.ARGV0_VAR] = exe
|
246
|
+
env[_PyremoteBootstrapConsts.CONTEXT_NAME_VAR] = context_name
|
243
247
|
|
244
248
|
# Start repl reading stdin from r0
|
245
|
-
os.execl(exe, exe + (
|
249
|
+
os.execl(exe, exe + (_PyremoteBootstrapConsts.PROC_TITLE_FMT % (context_name,)))
|
246
250
|
|
247
251
|
else:
|
248
252
|
# Child process
|
249
253
|
|
250
254
|
# Write first ack
|
251
|
-
os.write(1,
|
255
|
+
os.write(1, _PyremoteBootstrapConsts.ACK0)
|
252
256
|
|
253
257
|
# Write pid
|
254
258
|
os.write(1, struct.pack('<Q', pid))
|
@@ -267,7 +271,7 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
|
|
267
271
|
fp.close()
|
268
272
|
|
269
273
|
# Write second ack
|
270
|
-
os.write(1,
|
274
|
+
os.write(1, _PyremoteBootstrapConsts.ACK1)
|
271
275
|
|
272
276
|
# Exit child
|
273
277
|
sys.exit(0)
|
@@ -284,20 +288,8 @@ def pyremote_build_bootstrap_cmd(context_name: str) -> str:
|
|
284
288
|
import textwrap
|
285
289
|
bs_src = textwrap.dedent(inspect.getsource(_pyremote_bootstrap_main))
|
286
290
|
|
287
|
-
for
|
288
|
-
'
|
289
|
-
'_PYREMOTE_BOOTSTRAP_SRC_FD',
|
290
|
-
|
291
|
-
'_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR',
|
292
|
-
'_PYREMOTE_BOOTSTRAP_ARGV0_VAR',
|
293
|
-
'_PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR',
|
294
|
-
|
295
|
-
'_PYREMOTE_BOOTSTRAP_ACK0',
|
296
|
-
'_PYREMOTE_BOOTSTRAP_ACK1',
|
297
|
-
|
298
|
-
'_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT',
|
299
|
-
]:
|
300
|
-
bs_src = bs_src.replace(gl, repr(globals()[gl]))
|
291
|
+
for an, av in sorted(_PyremoteBootstrapConsts.__dict__.items(), key=lambda kv: -len(kv[0])):
|
292
|
+
bs_src = bs_src.replace(f'_PyremoteBootstrapConsts.{an}', repr(av))
|
301
293
|
|
302
294
|
bs_src = '\n'.join(
|
303
295
|
cl
|
@@ -312,7 +304,7 @@ def pyremote_build_bootstrap_cmd(context_name: str) -> str:
|
|
312
304
|
raise ValueError(bs_z85)
|
313
305
|
|
314
306
|
stmts = [
|
315
|
-
f'import {", ".join(
|
307
|
+
f'import {", ".join(_PyremoteBootstrapConsts.IMPORTS)}',
|
316
308
|
f'exec(zlib.decompress(base64.b85decode(b"{bs_z85.decode("ascii")}")))',
|
317
309
|
f'_pyremote_bootstrap_main("{context_name}")',
|
318
310
|
]
|
@@ -336,19 +328,19 @@ class PyremotePayloadRuntime:
|
|
336
328
|
|
337
329
|
def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
|
338
330
|
# If src file var is not present we need to do initial finalization
|
339
|
-
if
|
331
|
+
if _PyremoteBootstrapConsts.SRC_FILE_VAR not in os.environ:
|
340
332
|
# Read second copy of payload src
|
341
|
-
r1 = os.fdopen(
|
333
|
+
r1 = os.fdopen(_PyremoteBootstrapConsts.SRC_FD, 'rb', 0)
|
342
334
|
payload_src = r1.read().decode('utf-8')
|
343
335
|
r1.close()
|
344
336
|
|
345
337
|
# Reap boostrap child. Must be done after reading second copy of source because source may be too big to fit in
|
346
338
|
# a pipe at once.
|
347
|
-
os.waitpid(int(os.environ.pop(
|
339
|
+
os.waitpid(int(os.environ.pop(_PyremoteBootstrapConsts.CHILD_PID_VAR)), 0)
|
348
340
|
|
349
341
|
# Read options
|
350
|
-
options_json_len = struct.unpack('<I', os.read(
|
351
|
-
if len(options_json := os.read(
|
342
|
+
options_json_len = struct.unpack('<I', os.read(_PyremoteBootstrapConsts.INPUT_FD, 4))[0]
|
343
|
+
if len(options_json := os.read(_PyremoteBootstrapConsts.INPUT_FD, options_json_len)) != options_json_len:
|
352
344
|
raise EOFError
|
353
345
|
options = PyremoteBootstrapOptions(**json.loads(options_json.decode('utf-8')))
|
354
346
|
|
@@ -361,29 +353,29 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
|
|
361
353
|
os.close(tfd)
|
362
354
|
|
363
355
|
# Set vars
|
364
|
-
os.environ[
|
365
|
-
os.environ[
|
356
|
+
os.environ[_PyremoteBootstrapConsts.SRC_FILE_VAR] = tfn
|
357
|
+
os.environ[_PyremoteBootstrapConsts.OPTIONS_JSON_VAR] = options_json.decode('utf-8')
|
366
358
|
|
367
359
|
# Re-exec temp file
|
368
|
-
exe = os.environ[
|
369
|
-
context_name = os.environ[
|
370
|
-
os.execl(exe, exe + (
|
360
|
+
exe = os.environ[_PyremoteBootstrapConsts.ARGV0_VAR]
|
361
|
+
context_name = os.environ[_PyremoteBootstrapConsts.CONTEXT_NAME_VAR]
|
362
|
+
os.execl(exe, exe + (_PyremoteBootstrapConsts.PROC_TITLE_FMT % (context_name,)), tfn)
|
371
363
|
|
372
364
|
else:
|
373
365
|
# Load options json var
|
374
|
-
options_json_str = os.environ.pop(
|
366
|
+
options_json_str = os.environ.pop(_PyremoteBootstrapConsts.OPTIONS_JSON_VAR)
|
375
367
|
options = PyremoteBootstrapOptions(**json.loads(options_json_str))
|
376
368
|
|
377
369
|
# Read temp source file
|
378
|
-
with open(os.environ.pop(
|
370
|
+
with open(os.environ.pop(_PyremoteBootstrapConsts.SRC_FILE_VAR)) as sf:
|
379
371
|
payload_src = sf.read()
|
380
372
|
|
381
373
|
# Restore vars
|
382
|
-
sys.executable = os.environ.pop(
|
383
|
-
context_name = os.environ.pop(
|
374
|
+
sys.executable = os.environ.pop(_PyremoteBootstrapConsts.ARGV0_VAR)
|
375
|
+
context_name = os.environ.pop(_PyremoteBootstrapConsts.CONTEXT_NAME_VAR)
|
384
376
|
|
385
377
|
# Write third ack
|
386
|
-
os.write(1,
|
378
|
+
os.write(1, _PyremoteBootstrapConsts.ACK2)
|
387
379
|
|
388
380
|
# Write env info
|
389
381
|
env_info = _get_pyremote_env_info()
|
@@ -392,7 +384,7 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
|
|
392
384
|
os.write(1, env_info_json.encode('utf-8'))
|
393
385
|
|
394
386
|
# Setup IO
|
395
|
-
input = os.fdopen(
|
387
|
+
input = os.fdopen(_PyremoteBootstrapConsts.INPUT_FD, 'rb', 0) # noqa
|
396
388
|
output = os.fdopen(os.dup(1), 'wb', 0) # noqa
|
397
389
|
os.dup2(nfd := os.open('/dev/null', os.O_WRONLY), 1)
|
398
390
|
os.close(nfd)
|
@@ -402,7 +394,7 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
|
|
402
394
|
sys.modules[mn] = sys.modules['__main__']
|
403
395
|
|
404
396
|
# Write fourth ack
|
405
|
-
output.write(
|
397
|
+
output.write(_PyremoteBootstrapConsts.ACK3)
|
406
398
|
|
407
399
|
# Return
|
408
400
|
return PyremotePayloadRuntime(
|
@@ -476,7 +468,7 @@ class PyremoteBootstrapDriver:
|
|
476
468
|
|
477
469
|
def gen(self) -> ta.Generator[ta.Union[Read, Write], ta.Optional[bytes], Result]:
|
478
470
|
# Read first ack (after fork)
|
479
|
-
yield from self._expect(
|
471
|
+
yield from self._expect(_PyremoteBootstrapConsts.ACK0)
|
480
472
|
|
481
473
|
# Read pid
|
482
474
|
d = yield from self._read(8)
|
@@ -487,14 +479,14 @@ class PyremoteBootstrapDriver:
|
|
487
479
|
yield from self._write(self._payload_z)
|
488
480
|
|
489
481
|
# Read second ack (after writing src copies)
|
490
|
-
yield from self._expect(
|
482
|
+
yield from self._expect(_PyremoteBootstrapConsts.ACK1)
|
491
483
|
|
492
484
|
# Write options
|
493
485
|
yield from self._write(struct.pack('<I', len(self._options_json)))
|
494
486
|
yield from self._write(self._options_json)
|
495
487
|
|
496
488
|
# Read third ack (after reaping child process)
|
497
|
-
yield from self._expect(
|
489
|
+
yield from self._expect(_PyremoteBootstrapConsts.ACK2)
|
498
490
|
|
499
491
|
# Read env info
|
500
492
|
d = yield from self._read(4)
|
@@ -504,7 +496,7 @@ class PyremoteBootstrapDriver:
|
|
504
496
|
env_info = PyremoteEnvInfo.from_dict(json.loads(env_info_json))
|
505
497
|
|
506
498
|
# Read fourth ack (after finalization completed)
|
507
|
-
yield from self._expect(
|
499
|
+
yield from self._expect(_PyremoteBootstrapConsts.ACK3)
|
508
500
|
|
509
501
|
# Return
|
510
502
|
return self.Result(
|
@@ -848,29 +848,33 @@ def _get_pyremote_env_info() -> PyremoteEnvInfo:
|
|
848
848
|
##
|
849
849
|
|
850
850
|
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
'
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
851
|
+
class _PyremoteBootstrapConsts:
|
852
|
+
def __new__(cls, *args, **kwargs): # noqa
|
853
|
+
raise TypeError
|
854
|
+
|
855
|
+
INPUT_FD = 100
|
856
|
+
SRC_FD = 101
|
857
|
+
|
858
|
+
CHILD_PID_VAR = '_OPYR_CHILD_PID'
|
859
|
+
ARGV0_VAR = '_OPYR_ARGV0'
|
860
|
+
CONTEXT_NAME_VAR = '_OPYR_CONTEXT_NAME'
|
861
|
+
SRC_FILE_VAR = '_OPYR_SRC_FILE'
|
862
|
+
OPTIONS_JSON_VAR = '_OPYR_OPTIONS_JSON'
|
863
|
+
|
864
|
+
ACK0 = b'OPYR000\n'
|
865
|
+
ACK1 = b'OPYR001\n'
|
866
|
+
ACK2 = b'OPYR002\n'
|
867
|
+
ACK3 = b'OPYR003\n'
|
868
|
+
|
869
|
+
PROC_TITLE_FMT = '(pyremote:%s)'
|
870
|
+
|
871
|
+
IMPORTS = (
|
872
|
+
'base64',
|
873
|
+
'os',
|
874
|
+
'struct',
|
875
|
+
'sys',
|
876
|
+
'zlib',
|
877
|
+
)
|
874
878
|
|
875
879
|
|
876
880
|
def _pyremote_bootstrap_main(context_name: str) -> None:
|
@@ -885,13 +889,13 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
|
|
885
889
|
# Parent process
|
886
890
|
|
887
891
|
# Dup original stdin to comm_fd for use as comm channel
|
888
|
-
os.dup2(0,
|
892
|
+
os.dup2(0, _PyremoteBootstrapConsts.INPUT_FD)
|
889
893
|
|
890
894
|
# Overwrite stdin (fed to python repl) with first copy of src
|
891
895
|
os.dup2(r0, 0)
|
892
896
|
|
893
897
|
# Dup second copy of src to src_fd to recover after launch
|
894
|
-
os.dup2(r1,
|
898
|
+
os.dup2(r1, _PyremoteBootstrapConsts.SRC_FD)
|
895
899
|
|
896
900
|
# Close remaining fd's
|
897
901
|
for f in [r0, w0, r1, w1]:
|
@@ -900,18 +904,18 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
|
|
900
904
|
# Save vars
|
901
905
|
env = os.environ
|
902
906
|
exe = sys.executable
|
903
|
-
env[
|
904
|
-
env[
|
905
|
-
env[
|
907
|
+
env[_PyremoteBootstrapConsts.CHILD_PID_VAR] = str(cp)
|
908
|
+
env[_PyremoteBootstrapConsts.ARGV0_VAR] = exe
|
909
|
+
env[_PyremoteBootstrapConsts.CONTEXT_NAME_VAR] = context_name
|
906
910
|
|
907
911
|
# Start repl reading stdin from r0
|
908
|
-
os.execl(exe, exe + (
|
912
|
+
os.execl(exe, exe + (_PyremoteBootstrapConsts.PROC_TITLE_FMT % (context_name,)))
|
909
913
|
|
910
914
|
else:
|
911
915
|
# Child process
|
912
916
|
|
913
917
|
# Write first ack
|
914
|
-
os.write(1,
|
918
|
+
os.write(1, _PyremoteBootstrapConsts.ACK0)
|
915
919
|
|
916
920
|
# Write pid
|
917
921
|
os.write(1, struct.pack('<Q', pid))
|
@@ -930,7 +934,7 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
|
|
930
934
|
fp.close()
|
931
935
|
|
932
936
|
# Write second ack
|
933
|
-
os.write(1,
|
937
|
+
os.write(1, _PyremoteBootstrapConsts.ACK1)
|
934
938
|
|
935
939
|
# Exit child
|
936
940
|
sys.exit(0)
|
@@ -947,20 +951,8 @@ def pyremote_build_bootstrap_cmd(context_name: str) -> str:
|
|
947
951
|
import textwrap
|
948
952
|
bs_src = textwrap.dedent(inspect.getsource(_pyremote_bootstrap_main))
|
949
953
|
|
950
|
-
for
|
951
|
-
'
|
952
|
-
'_PYREMOTE_BOOTSTRAP_SRC_FD',
|
953
|
-
|
954
|
-
'_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR',
|
955
|
-
'_PYREMOTE_BOOTSTRAP_ARGV0_VAR',
|
956
|
-
'_PYREMOTE_BOOTSTRAP_CONTEXT_NAME_VAR',
|
957
|
-
|
958
|
-
'_PYREMOTE_BOOTSTRAP_ACK0',
|
959
|
-
'_PYREMOTE_BOOTSTRAP_ACK1',
|
960
|
-
|
961
|
-
'_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT',
|
962
|
-
]:
|
963
|
-
bs_src = bs_src.replace(gl, repr(globals()[gl]))
|
954
|
+
for an, av in sorted(_PyremoteBootstrapConsts.__dict__.items(), key=lambda kv: -len(kv[0])):
|
955
|
+
bs_src = bs_src.replace(f'_PyremoteBootstrapConsts.{an}', repr(av))
|
964
956
|
|
965
957
|
bs_src = '\n'.join(
|
966
958
|
cl
|
@@ -975,7 +967,7 @@ def pyremote_build_bootstrap_cmd(context_name: str) -> str:
|
|
975
967
|
raise ValueError(bs_z85)
|
976
968
|
|
977
969
|
stmts = [
|
978
|
-
f'import {", ".join(
|
970
|
+
f'import {", ".join(_PyremoteBootstrapConsts.IMPORTS)}',
|
979
971
|
f'exec(zlib.decompress(base64.b85decode(b"{bs_z85.decode("ascii")}")))',
|
980
972
|
f'_pyremote_bootstrap_main("{context_name}")',
|
981
973
|
]
|
@@ -999,19 +991,19 @@ class PyremotePayloadRuntime:
|
|
999
991
|
|
1000
992
|
def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
|
1001
993
|
# If src file var is not present we need to do initial finalization
|
1002
|
-
if
|
994
|
+
if _PyremoteBootstrapConsts.SRC_FILE_VAR not in os.environ:
|
1003
995
|
# Read second copy of payload src
|
1004
|
-
r1 = os.fdopen(
|
996
|
+
r1 = os.fdopen(_PyremoteBootstrapConsts.SRC_FD, 'rb', 0)
|
1005
997
|
payload_src = r1.read().decode('utf-8')
|
1006
998
|
r1.close()
|
1007
999
|
|
1008
1000
|
# Reap boostrap child. Must be done after reading second copy of source because source may be too big to fit in
|
1009
1001
|
# a pipe at once.
|
1010
|
-
os.waitpid(int(os.environ.pop(
|
1002
|
+
os.waitpid(int(os.environ.pop(_PyremoteBootstrapConsts.CHILD_PID_VAR)), 0)
|
1011
1003
|
|
1012
1004
|
# Read options
|
1013
|
-
options_json_len = struct.unpack('<I', os.read(
|
1014
|
-
if len(options_json := os.read(
|
1005
|
+
options_json_len = struct.unpack('<I', os.read(_PyremoteBootstrapConsts.INPUT_FD, 4))[0]
|
1006
|
+
if len(options_json := os.read(_PyremoteBootstrapConsts.INPUT_FD, options_json_len)) != options_json_len:
|
1015
1007
|
raise EOFError
|
1016
1008
|
options = PyremoteBootstrapOptions(**json.loads(options_json.decode('utf-8')))
|
1017
1009
|
|
@@ -1024,29 +1016,29 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
|
|
1024
1016
|
os.close(tfd)
|
1025
1017
|
|
1026
1018
|
# Set vars
|
1027
|
-
os.environ[
|
1028
|
-
os.environ[
|
1019
|
+
os.environ[_PyremoteBootstrapConsts.SRC_FILE_VAR] = tfn
|
1020
|
+
os.environ[_PyremoteBootstrapConsts.OPTIONS_JSON_VAR] = options_json.decode('utf-8')
|
1029
1021
|
|
1030
1022
|
# Re-exec temp file
|
1031
|
-
exe = os.environ[
|
1032
|
-
context_name = os.environ[
|
1033
|
-
os.execl(exe, exe + (
|
1023
|
+
exe = os.environ[_PyremoteBootstrapConsts.ARGV0_VAR]
|
1024
|
+
context_name = os.environ[_PyremoteBootstrapConsts.CONTEXT_NAME_VAR]
|
1025
|
+
os.execl(exe, exe + (_PyremoteBootstrapConsts.PROC_TITLE_FMT % (context_name,)), tfn)
|
1034
1026
|
|
1035
1027
|
else:
|
1036
1028
|
# Load options json var
|
1037
|
-
options_json_str = os.environ.pop(
|
1029
|
+
options_json_str = os.environ.pop(_PyremoteBootstrapConsts.OPTIONS_JSON_VAR)
|
1038
1030
|
options = PyremoteBootstrapOptions(**json.loads(options_json_str))
|
1039
1031
|
|
1040
1032
|
# Read temp source file
|
1041
|
-
with open(os.environ.pop(
|
1033
|
+
with open(os.environ.pop(_PyremoteBootstrapConsts.SRC_FILE_VAR)) as sf:
|
1042
1034
|
payload_src = sf.read()
|
1043
1035
|
|
1044
1036
|
# Restore vars
|
1045
|
-
sys.executable = os.environ.pop(
|
1046
|
-
context_name = os.environ.pop(
|
1037
|
+
sys.executable = os.environ.pop(_PyremoteBootstrapConsts.ARGV0_VAR)
|
1038
|
+
context_name = os.environ.pop(_PyremoteBootstrapConsts.CONTEXT_NAME_VAR)
|
1047
1039
|
|
1048
1040
|
# Write third ack
|
1049
|
-
os.write(1,
|
1041
|
+
os.write(1, _PyremoteBootstrapConsts.ACK2)
|
1050
1042
|
|
1051
1043
|
# Write env info
|
1052
1044
|
env_info = _get_pyremote_env_info()
|
@@ -1055,7 +1047,7 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
|
|
1055
1047
|
os.write(1, env_info_json.encode('utf-8'))
|
1056
1048
|
|
1057
1049
|
# Setup IO
|
1058
|
-
input = os.fdopen(
|
1050
|
+
input = os.fdopen(_PyremoteBootstrapConsts.INPUT_FD, 'rb', 0) # noqa
|
1059
1051
|
output = os.fdopen(os.dup(1), 'wb', 0) # noqa
|
1060
1052
|
os.dup2(nfd := os.open('/dev/null', os.O_WRONLY), 1)
|
1061
1053
|
os.close(nfd)
|
@@ -1065,7 +1057,7 @@ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
|
|
1065
1057
|
sys.modules[mn] = sys.modules['__main__']
|
1066
1058
|
|
1067
1059
|
# Write fourth ack
|
1068
|
-
output.write(
|
1060
|
+
output.write(_PyremoteBootstrapConsts.ACK3)
|
1069
1061
|
|
1070
1062
|
# Return
|
1071
1063
|
return PyremotePayloadRuntime(
|
@@ -1139,7 +1131,7 @@ class PyremoteBootstrapDriver:
|
|
1139
1131
|
|
1140
1132
|
def gen(self) -> ta.Generator[ta.Union[Read, Write], ta.Optional[bytes], Result]:
|
1141
1133
|
# Read first ack (after fork)
|
1142
|
-
yield from self._expect(
|
1134
|
+
yield from self._expect(_PyremoteBootstrapConsts.ACK0)
|
1143
1135
|
|
1144
1136
|
# Read pid
|
1145
1137
|
d = yield from self._read(8)
|
@@ -1150,14 +1142,14 @@ class PyremoteBootstrapDriver:
|
|
1150
1142
|
yield from self._write(self._payload_z)
|
1151
1143
|
|
1152
1144
|
# Read second ack (after writing src copies)
|
1153
|
-
yield from self._expect(
|
1145
|
+
yield from self._expect(_PyremoteBootstrapConsts.ACK1)
|
1154
1146
|
|
1155
1147
|
# Write options
|
1156
1148
|
yield from self._write(struct.pack('<I', len(self._options_json)))
|
1157
1149
|
yield from self._write(self._options_json)
|
1158
1150
|
|
1159
1151
|
# Read third ack (after reaping child process)
|
1160
|
-
yield from self._expect(
|
1152
|
+
yield from self._expect(_PyremoteBootstrapConsts.ACK2)
|
1161
1153
|
|
1162
1154
|
# Read env info
|
1163
1155
|
d = yield from self._read(4)
|
@@ -1167,7 +1159,7 @@ class PyremoteBootstrapDriver:
|
|
1167
1159
|
env_info = PyremoteEnvInfo.from_dict(json.loads(env_info_json))
|
1168
1160
|
|
1169
1161
|
# Read fourth ack (after finalization completed)
|
1170
|
-
yield from self._expect(
|
1162
|
+
yield from self._expect(_PyremoteBootstrapConsts.ACK3)
|
1171
1163
|
|
1172
1164
|
# Return
|
1173
1165
|
return self.Result(
|
@@ -7887,7 +7879,7 @@ class SubprocessRunnable(abc.ABC, ta.Generic[T]):
|
|
7887
7879
|
|
7888
7880
|
|
7889
7881
|
class IndentWriter:
|
7890
|
-
DEFAULT_INDENT = ' ' * 4
|
7882
|
+
DEFAULT_INDENT: ta.ClassVar[str] = ' ' * 4
|
7891
7883
|
|
7892
7884
|
def __init__(
|
7893
7885
|
self,
|
@@ -7900,6 +7892,7 @@ class IndentWriter:
|
|
7900
7892
|
self._buf = buf if buf is not None else io.StringIO()
|
7901
7893
|
self._indent = check.isinstance(indent, str) if indent is not None else self.DEFAULT_INDENT
|
7902
7894
|
self._level = 0
|
7895
|
+
self._cache: ta.Dict[int, str] = {}
|
7903
7896
|
self._has_indented = False
|
7904
7897
|
|
7905
7898
|
@contextlib.contextmanager
|
@@ -7911,7 +7904,10 @@ class IndentWriter:
|
|
7911
7904
|
self._level -= num
|
7912
7905
|
|
7913
7906
|
def write(self, s: str) -> None:
|
7914
|
-
|
7907
|
+
try:
|
7908
|
+
indent = self._cache[self._level]
|
7909
|
+
except KeyError:
|
7910
|
+
indent = self._cache[self._level] = self._indent * self._level
|
7915
7911
|
i = 0
|
7916
7912
|
while i < len(s):
|
7917
7913
|
if not self._has_indented:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ominfra
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev297
|
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.12
|
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.dev297
|
16
|
+
Requires-Dist: omlish==0.0.0.dev297
|
17
17
|
Provides-Extra: all
|
18
18
|
Requires-Dist: paramiko~=3.5; extra == "all"
|
19
19
|
Requires-Dist: asyncssh~=2.20; extra == "all"
|