ominfra 0.0.0.dev356__py3-none-any.whl → 0.0.0.dev357__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.
Files changed (33) hide show
  1. ominfra/manage/commands/injection.py +3 -0
  2. ominfra/manage/commands/local.py +3 -0
  3. ominfra/manage/commands/marshal.py +3 -0
  4. ominfra/manage/commands/subprocess.py +42 -4
  5. ominfra/manage/deploy/apps.py +3 -0
  6. ominfra/manage/deploy/conf/inject.py +3 -0
  7. ominfra/manage/deploy/injection.py +3 -0
  8. ominfra/manage/deploy/nginx.py +3 -0
  9. ominfra/manage/deploy/paths/inject.py +3 -0
  10. ominfra/manage/deploy/paths/manager.py +3 -0
  11. ominfra/manage/deploy/paths/owners.py +3 -0
  12. ominfra/manage/deploy/paths/specs.py +3 -0
  13. ominfra/manage/deploy/systemd.py +3 -0
  14. ominfra/manage/deploy/tmp.py +3 -0
  15. ominfra/manage/deploy/venvs.py +3 -0
  16. ominfra/manage/remote/config.py +3 -0
  17. ominfra/manage/remote/connection.py +1 -1
  18. ominfra/manage/remote/payload.py +3 -0
  19. ominfra/manage/remote/spawning.py +1 -1
  20. ominfra/manage/system/config.py +3 -0
  21. ominfra/manage/system/inject.py +3 -0
  22. ominfra/manage/system/packages.py +4 -1
  23. ominfra/manage/targets/connection.py +1 -1
  24. ominfra/pyremote.py +10 -4
  25. ominfra/scripts/journald2aws.py +1 -1
  26. ominfra/scripts/manage.py +247 -18
  27. ominfra/scripts/supervisor.py +1 -1
  28. {ominfra-0.0.0.dev356.dist-info → ominfra-0.0.0.dev357.dist-info}/METADATA +3 -3
  29. {ominfra-0.0.0.dev356.dist-info → ominfra-0.0.0.dev357.dist-info}/RECORD +33 -33
  30. {ominfra-0.0.0.dev356.dist-info → ominfra-0.0.0.dev357.dist-info}/WHEEL +0 -0
  31. {ominfra-0.0.0.dev356.dist-info → ominfra-0.0.0.dev357.dist-info}/entry_points.txt +0 -0
  32. {ominfra-0.0.0.dev356.dist-info → ominfra-0.0.0.dev357.dist-info}/licenses/LICENSE +0 -0
  33. {ominfra-0.0.0.dev356.dist-info → ominfra-0.0.0.dev357.dist-info}/top_level.txt +0 -0
@@ -11,6 +11,9 @@ from .base import CommandExecutorRegistration
11
11
  from .base import CommandRegistration
12
12
 
13
13
 
14
+ ##
15
+
16
+
14
17
  def bind_command(
15
18
  command_cls: ta.Type[Command],
16
19
  executor_cls: ta.Optional[ta.Type[CommandExecutor]],
@@ -4,6 +4,9 @@ from .base import CommandExecutor
4
4
  from .types import CommandExecutorMap
5
5
 
6
6
 
7
+ ##
8
+
9
+
7
10
  class LocalCommandExecutor(CommandExecutor):
8
11
  def __init__(
9
12
  self,
@@ -5,6 +5,9 @@ from .base import Command
5
5
  from .base import CommandNameMap
6
6
 
7
7
 
8
+ ##
9
+
10
+
8
11
  def install_command_marshaling(
9
12
  cmds: CommandNameMap,
10
13
  msh: ObjMarshalerManager,
@@ -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 cmd.input is not None else None,
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=cmd.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
- stdout=stdout, # noqa
81
- stderr=stderr, # noqa
119
+ **out_kw,
82
120
  )
@@ -20,6 +20,9 @@ from .types import DeployHome
20
20
  from .venvs import DeployVenvManager
21
21
 
22
22
 
23
+ ##
24
+
25
+
23
26
  class DeployAppManager(DeployPathOwner):
24
27
  def __init__(
25
28
  self,
@@ -9,6 +9,9 @@ from ..injection import bind_deploy_manager
9
9
  from .manager import DeployConfManager
10
10
 
11
11
 
12
+ ##
13
+
14
+
12
15
  def bind_deploy_conf() -> InjectorBindings:
13
16
  lst: ta.List[InjectorBindingOrBindings] = [
14
17
  bind_deploy_manager(DeployConfManager),
@@ -5,6 +5,9 @@ from omlish.lite.inject import inj
5
5
  from .paths.owners import DeployPathOwner
6
6
 
7
7
 
8
+ ##
9
+
10
+
8
11
  def bind_deploy_manager(cls: type) -> InjectorBindings:
9
12
  return inj.as_bindings(
10
13
  inj.bind(cls, singleton=True),
@@ -4,5 +4,8 @@ verify - nginx -t
4
4
  """
5
5
 
6
6
 
7
+ ##
8
+
9
+
7
10
  class DeployNginxManager:
8
11
  pass
@@ -10,6 +10,9 @@ from .owners import DeployPathOwner
10
10
  from .owners import DeployPathOwners
11
11
 
12
12
 
13
+ ##
14
+
15
+
13
16
  def bind_deploy_paths() -> InjectorBindings:
14
17
  lst: ta.List[InjectorBindingOrBindings] = [
15
18
  inj.bind_array(DeployPathOwner),
@@ -9,6 +9,9 @@ from .paths import DeployPath
9
9
  from .paths import DeployPathError
10
10
 
11
11
 
12
+ ##
13
+
14
+
12
15
  class DeployPathsManager:
13
16
  def __init__(
14
17
  self,
@@ -9,6 +9,9 @@ from ..types import DeployHome
9
9
  from .paths import DeployPath
10
10
 
11
11
 
12
+ ##
13
+
14
+
12
15
  class DeployPathOwner(abc.ABC):
13
16
  @abc.abstractmethod
14
17
  def get_owned_deploy_paths(self) -> ta.AbstractSet[DeployPath]:
@@ -2,6 +2,9 @@
2
2
  from omlish.lite.check import check
3
3
 
4
4
 
5
+ ##
6
+
7
+
5
8
  def check_valid_deploy_spec_path(s: str) -> str:
6
9
  check.non_empty_str(s)
7
10
  for c in ['..', '//']:
@@ -22,6 +22,9 @@ from .tmp import DeployHomeAtomics
22
22
  from .types import DeployHome
23
23
 
24
24
 
25
+ ##
26
+
27
+
25
28
  class DeploySystemdManager:
26
29
  def __init__(
27
30
  self,
@@ -8,6 +8,9 @@ from .paths.owners import SingleDirDeployPathOwner
8
8
  from .types import DeployHome
9
9
 
10
10
 
11
+ ##
12
+
13
+
11
14
  class DeployHomeAtomics(Func1[DeployHome, AtomicPathSwapping]):
12
15
  pass
13
16
 
@@ -15,6 +15,9 @@ from omlish.lite.check import check
15
15
  from .specs import DeployVenvSpec
16
16
 
17
17
 
18
+ ##
19
+
20
+
18
21
  class DeployVenvManager:
19
22
  async def setup_venv(
20
23
  self,
@@ -5,6 +5,9 @@ import typing as ta
5
5
  from omlish.lite.pycharm import PycharmRemoteDebug
6
6
 
7
7
 
8
+ ##
9
+
10
+
8
11
  @dc.dataclass(frozen=True)
9
12
  class RemoteConfig:
10
13
  payload_file: ta.Optional[str] = None
@@ -1,4 +1,4 @@
1
- # ruff: noqa: UP006 UP007 UP045
1
+ # ruff: noqa: UP006 UP007 UP043 UP045
2
2
  import asyncio
3
3
  import contextlib
4
4
  import typing as ta
@@ -9,6 +9,9 @@ from omlish.lite.cached import cached_nullary
9
9
  RemoteExecutionPayloadFile = ta.NewType('RemoteExecutionPayloadFile', str)
10
10
 
11
11
 
12
+ ##
13
+
14
+
12
15
  @cached_nullary
13
16
  def _get_self_src() -> str:
14
17
  return inspect.getsource(sys.modules[__name__])
@@ -1,4 +1,4 @@
1
- # ruff: noqa: UP006 UP007 UP045
1
+ # ruff: noqa: UP006 UP007 UP043 UP045
2
2
  import abc
3
3
  import asyncio
4
4
  import contextlib
@@ -5,6 +5,9 @@ import typing as ta
5
5
  from .platforms import Platform
6
6
 
7
7
 
8
+ ##
9
+
10
+
8
11
  @dc.dataclass(frozen=True)
9
12
  class SystemConfig:
10
13
  platform: ta.Optional[Platform] = None
@@ -20,6 +20,9 @@ from .platforms import Platform
20
20
  from .platforms import detect_system_platform
21
21
 
22
22
 
23
+ ##
24
+
25
+
23
26
  def bind_system(
24
27
  *,
25
28
  system_config: SystemConfig,
@@ -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
  import abc
3
3
  import contextlib
4
4
  import dataclasses as dc
ominfra/pyremote.py CHANGED
@@ -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 = list(payload_src)
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
- parts.insert(0, f'__name__ = {mn!r}')
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 '\n\n'.join(parts)
455
+ return ''.join(parts)
450
456
 
451
457
  #
452
458
 
@@ -5,7 +5,7 @@
5
5
  # @omlish-generated
6
6
  # @omlish-amalg-output ../clouds/aws/journald2aws/main.py
7
7
  # @omlish-git-diff-omit
8
- # ruff: noqa: N802 UP006 UP007 UP036 UP045
8
+ # ruff: noqa: N802 UP006 UP007 UP036 UP043 UP045
9
9
  import abc
10
10
  import argparse
11
11
  import base64
ominfra/scripts/manage.py CHANGED
@@ -5,7 +5,7 @@
5
5
  # @omlish-generated
6
6
  # @omlish-amalg-output ../manage/main.py
7
7
  # @omlish-git-diff-omit
8
- # ruff: noqa: N802 TC003 UP006 UP007 UP036 UP045
8
+ # ruff: noqa: N802 TC003 UP006 UP007 UP036 UP043 UP045
9
9
  """
10
10
  manage.py -s 'docker run -i python:3.13'
11
11
  manage.py -s 'ssh -i /foo/bar.pem foo@bar.baz' -q --python=python3.8
@@ -152,7 +152,7 @@ KeyDeployTagT = ta.TypeVar('KeyDeployTagT', bound='KeyDeployTag')
152
152
  SubprocessChannelOption = ta.Literal['pipe', 'stdout', 'devnull'] # ta.TypeAlias
153
153
 
154
154
  # system/packages.py
155
- SystemPackageOrStr = ta.Union['SystemPackage', str]
155
+ SystemPackageOrStr = ta.Union['SystemPackage', str] # ta.TypeAlias
156
156
 
157
157
 
158
158
  ########################################
@@ -1103,15 +1103,21 @@ class PyremoteBootstrapDriver:
1103
1103
  if isinstance(payload_src, str):
1104
1104
  parts = [payload_src]
1105
1105
  else:
1106
- parts = list(payload_src)
1106
+ parts = []
1107
+ for i, p in enumerate(payload_src):
1108
+ if i:
1109
+ parts.append('\n\n')
1110
+ parts.append(p)
1107
1111
 
1108
1112
  if (mn := options.main_name_override) is not None:
1109
- parts.insert(0, f'__name__ = {mn!r}')
1113
+ # Must go on same single line as first line of user payload to preserve '<stdin>' line numbers. If more
1114
+ # things wind up having to be done here, it can still be crammed on one line into a single `exec()`.
1115
+ parts.insert(0, f'__name__ = {mn!r}; ')
1110
1116
 
1111
1117
  if len(parts) == 1:
1112
1118
  return parts[0]
1113
1119
  else:
1114
- return '\n\n'.join(parts)
1120
+ return ''.join(parts)
1115
1121
 
1116
1122
  #
1117
1123
 
@@ -5062,6 +5068,9 @@ def build_command_name_map(crs: CommandRegistrations) -> CommandNameMap:
5062
5068
  # ../deploy/paths/specs.py
5063
5069
 
5064
5070
 
5071
+ ##
5072
+
5073
+
5065
5074
  def check_valid_deploy_spec_path(s: str) -> str:
5066
5075
  check.non_empty_str(s)
5067
5076
  for c in ['..', '//']:
@@ -5074,6 +5083,9 @@ def check_valid_deploy_spec_path(s: str) -> str:
5074
5083
  # ../remote/config.py
5075
5084
 
5076
5085
 
5086
+ ##
5087
+
5088
+
5077
5089
  @dc.dataclass(frozen=True)
5078
5090
  class RemoteConfig:
5079
5091
  payload_file: ta.Optional[str] = None
@@ -5098,6 +5110,9 @@ class RemoteConfig:
5098
5110
  RemoteExecutionPayloadFile = ta.NewType('RemoteExecutionPayloadFile', str)
5099
5111
 
5100
5112
 
5113
+ ##
5114
+
5115
+
5101
5116
  @cached_nullary
5102
5117
  def _get_self_src() -> str:
5103
5118
  return inspect.getsource(sys.modules[__name__])
@@ -8310,17 +8325,10 @@ class Interp:
8310
8325
 
8311
8326
 
8312
8327
  ########################################
8313
- # ../../../omdev/interp/uv/inject.py
8314
-
8315
-
8316
- def bind_interp_uv() -> InjectorBindings:
8317
- lst: ta.List[InjectorBindingOrBindings] = []
8318
-
8319
- return inj.as_bindings(*lst)
8328
+ # ../commands/injection.py
8320
8329
 
8321
8330
 
8322
- ########################################
8323
- # ../commands/injection.py
8331
+ ##
8324
8332
 
8325
8333
 
8326
8334
  def bind_command(
@@ -8344,6 +8352,9 @@ def bind_command(
8344
8352
  # ../commands/marshal.py
8345
8353
 
8346
8354
 
8355
+ ##
8356
+
8357
+
8347
8358
  def install_command_marshaling(
8348
8359
  cmds: CommandNameMap,
8349
8360
  msh: ObjMarshalerManager,
@@ -8811,6 +8822,9 @@ class RemoteChannelImpl(RemoteChannel):
8811
8822
  # ../system/config.py
8812
8823
 
8813
8824
 
8825
+ ##
8826
+
8827
+
8814
8828
  @dc.dataclass(frozen=True)
8815
8829
  class SystemConfig:
8816
8830
  platform: ta.Optional[Platform] = None
@@ -9127,6 +9141,9 @@ class MainBootstrap:
9127
9141
  # ../commands/local.py
9128
9142
 
9129
9143
 
9144
+ ##
9145
+
9146
+
9130
9147
  class LocalCommandExecutor(CommandExecutor):
9131
9148
  def __init__(
9132
9149
  self,
@@ -10077,6 +10094,9 @@ class BaseSubprocesses(abc.ABC): # noqa
10077
10094
  # ../../../omdev/interp/resolvers.py
10078
10095
 
10079
10096
 
10097
+ ##
10098
+
10099
+
10080
10100
  @dc.dataclass(frozen=True)
10081
10101
  class InterpResolverProviders:
10082
10102
  providers: ta.Sequence[ta.Tuple[str, InterpProvider]]
@@ -10413,6 +10433,9 @@ class DeployConfManager:
10413
10433
  # ../deploy/paths/owners.py
10414
10434
 
10415
10435
 
10436
+ ##
10437
+
10438
+
10416
10439
  class DeployPathOwner(abc.ABC):
10417
10440
  @abc.abstractmethod
10418
10441
  def get_owned_deploy_paths(self) -> ta.AbstractSet[DeployPath]:
@@ -10926,6 +10949,9 @@ def git_shallow_clone(
10926
10949
  # ../deploy/injection.py
10927
10950
 
10928
10951
 
10952
+ ##
10953
+
10954
+
10929
10955
  def bind_deploy_manager(cls: type) -> InjectorBindings:
10930
10956
  return inj.as_bindings(
10931
10957
  inj.bind(cls, singleton=True),
@@ -10938,6 +10964,9 @@ def bind_deploy_manager(cls: type) -> InjectorBindings:
10938
10964
  # ../deploy/paths/manager.py
10939
10965
 
10940
10966
 
10967
+ ##
10968
+
10969
+
10941
10970
  class DeployPathsManager:
10942
10971
  def __init__(
10943
10972
  self,
@@ -10966,6 +10995,9 @@ class DeployPathsManager:
10966
10995
  # ../deploy/tmp.py
10967
10996
 
10968
10997
 
10998
+ ##
10999
+
11000
+
10969
11001
  class DeployHomeAtomics(Func1[DeployHome, AtomicPathSwapping]):
10970
11002
  pass
10971
11003
 
@@ -11204,6 +11236,9 @@ asyncio_subprocesses = AsyncioSubprocesses()
11204
11236
  # ../../../omdev/interp/inspect.py
11205
11237
 
11206
11238
 
11239
+ ##
11240
+
11241
+
11207
11242
  @dc.dataclass(frozen=True)
11208
11243
  class InterpInspection:
11209
11244
  exe: str
@@ -11313,6 +11348,9 @@ TODO:
11313
11348
  """
11314
11349
 
11315
11350
 
11351
+ ##
11352
+
11353
+
11316
11354
  class Pyenv:
11317
11355
  def __init__(
11318
11356
  self,
@@ -11380,6 +11418,67 @@ class Pyenv:
11380
11418
  return True
11381
11419
 
11382
11420
 
11421
+ ########################################
11422
+ # ../../../omdev/interp/uv/uv.py
11423
+
11424
+
11425
+ ##
11426
+
11427
+
11428
+ @dc.dataclass(frozen=True)
11429
+ class UvConfig:
11430
+ ignore_path: bool = False
11431
+ pip_bootstrap: bool = True
11432
+
11433
+
11434
+ class Uv:
11435
+ def __init__(
11436
+ self,
11437
+ config: UvConfig = UvConfig(),
11438
+ *,
11439
+ log: ta.Optional[logging.Logger] = None,
11440
+ ) -> None:
11441
+ super().__init__()
11442
+
11443
+ self._config = config
11444
+ self._log = log
11445
+
11446
+ self._bootstrap_dir: ta.Optional[str] = None
11447
+
11448
+ def delete_bootstrap_dir(self) -> bool:
11449
+ if (bs := self._bootstrap_dir) is None:
11450
+ return False
11451
+
11452
+ shutil.rmtree(bs)
11453
+ self._bootstrap_dir = None
11454
+ return True
11455
+
11456
+ @async_cached_nullary
11457
+ async def uv_exe(self) -> ta.Optional[str]:
11458
+ if not self._config.ignore_path and (uv := shutil.which('uv')):
11459
+ return uv
11460
+
11461
+ if self._config.pip_bootstrap:
11462
+ if (bd := self._bootstrap_dir) is None:
11463
+ bd = self._bootstrap_dir = tempfile.mkdtemp()
11464
+
11465
+ if self._log is not None:
11466
+ self._log.info(f'Bootstrapping uv into %s', bd)
11467
+
11468
+ vn = 'uv-bootstrap'
11469
+ await asyncio_subprocesses.check_call(os.path.realpath(sys.executable), '-m', 'venv', vn, cwd=bd)
11470
+
11471
+ vx = os.path.join(bd, vn, 'bin', 'python3')
11472
+ await asyncio_subprocesses.check_call(vx, '-m', 'pip', 'install', 'uv', cwd=bd)
11473
+
11474
+ ux = os.path.join(bd, vn, 'bin', 'uv')
11475
+ check.state(os.path.isfile(ux))
11476
+
11477
+ return ux
11478
+
11479
+ return None
11480
+
11481
+
11383
11482
  ########################################
11384
11483
  # ../commands/subprocess.py
11385
11484
 
@@ -11396,13 +11495,26 @@ class SubprocessCommand(Command['SubprocessCommand.Output']):
11396
11495
  env: ta.Optional[ta.Mapping[str, str]] = None
11397
11496
 
11398
11497
  stdout: str = 'pipe' # SubprocessChannelOption
11498
+ decode_stdout: ta.Optional[str] = None
11499
+
11399
11500
  stderr: str = 'pipe' # SubprocessChannelOption
11501
+ decode_stderr: ta.Optional[str] = None
11400
11502
 
11401
11503
  input: ta.Optional[bytes] = None
11504
+ encode_input: ta.Optional[str] = None
11505
+ input_str: ta.Optional[str] = None
11506
+
11402
11507
  timeout: ta.Optional[float] = None
11403
11508
 
11404
11509
  def __post_init__(self) -> None:
11405
11510
  check.not_isinstance(self.cmd, str)
11511
+ check.state(not (self.input is not None and self.input_str is not None))
11512
+ if self.decode_stdout is not None:
11513
+ check.non_empty_str(self.decode_stdout)
11514
+ if self.decode_stderr is not None:
11515
+ check.non_empty_str(self.decode_stderr)
11516
+ if self.encode_input is not None:
11517
+ check.non_empty_str(self.encode_input)
11406
11518
 
11407
11519
  @dc.dataclass(frozen=True)
11408
11520
  class Output(Command.Output):
@@ -11412,11 +11524,25 @@ class SubprocessCommand(Command['SubprocessCommand.Output']):
11412
11524
  elapsed_s: float
11413
11525
 
11414
11526
  stdout: ta.Optional[bytes] = None
11527
+ stdout_str: ta.Optional[str] = None
11528
+
11415
11529
  stderr: ta.Optional[bytes] = None
11530
+ stderr_str: ta.Optional[str] = None
11416
11531
 
11417
11532
 
11418
11533
  class SubprocessCommandExecutor(CommandExecutor[SubprocessCommand, SubprocessCommand.Output]):
11534
+ DEFAULT_INPUT_ENCODING: ta.ClassVar[str] = 'utf-8'
11535
+
11419
11536
  async def execute(self, cmd: SubprocessCommand) -> SubprocessCommand.Output:
11537
+ input_bytes: ta.Optional[bytes]
11538
+ if cmd.input is not None:
11539
+ check.none(cmd.input_str)
11540
+ input_bytes = cmd.input
11541
+ elif cmd.input_str is not None:
11542
+ input_bytes = cmd.input_str.encode(cmd.encode_input or self.DEFAULT_INPUT_ENCODING)
11543
+ else:
11544
+ input_bytes = None
11545
+
11420
11546
  proc: asyncio.subprocess.Process
11421
11547
  async with asyncio_subprocesses.popen(
11422
11548
  *subprocess_maybe_shell_wrap_exec(*cmd.cmd),
@@ -11425,7 +11551,7 @@ class SubprocessCommandExecutor(CommandExecutor[SubprocessCommand, SubprocessCom
11425
11551
  cwd=cmd.cwd,
11426
11552
  env={**os.environ, **(cmd.env or {})},
11427
11553
 
11428
- stdin=subprocess.PIPE if cmd.input is not None else None,
11554
+ stdin=subprocess.PIPE if input_bytes is not None else None,
11429
11555
  stdout=SUBPROCESS_CHANNEL_OPTION_VALUES[ta.cast(SubprocessChannelOption, cmd.stdout)],
11430
11556
  stderr=SUBPROCESS_CHANNEL_OPTION_VALUES[ta.cast(SubprocessChannelOption, cmd.stderr)],
11431
11557
 
@@ -11434,19 +11560,30 @@ class SubprocessCommandExecutor(CommandExecutor[SubprocessCommand, SubprocessCom
11434
11560
  start_time = time.time()
11435
11561
  stdout, stderr = await asyncio_subprocesses.communicate(
11436
11562
  proc,
11437
- input=cmd.input,
11563
+ input=input,
11438
11564
  timeout=cmd.timeout,
11439
11565
  )
11440
11566
  end_time = time.time()
11441
11567
 
11568
+ out_kw: ta.Dict[str, ta.Any] = {}
11569
+ if stdout is not None:
11570
+ if cmd.decode_stdout is not None:
11571
+ out_kw.update(stdout_str=stdout.decode(cmd.decode_stdout))
11572
+ else:
11573
+ out_kw.update(stdout=stdout)
11574
+ if stderr is not None:
11575
+ if cmd.decode_stderr is not None:
11576
+ out_kw.update(stderr_str=stderr.decode(cmd.decode_stderr))
11577
+ else:
11578
+ out_kw.update(stderr=stderr)
11579
+
11442
11580
  return SubprocessCommand.Output(
11443
11581
  rc=check.not_none(proc.returncode),
11444
11582
  pid=proc.pid,
11445
11583
 
11446
11584
  elapsed_s=end_time - start_time,
11447
11585
 
11448
- stdout=stdout, # noqa
11449
- stderr=stderr, # noqa
11586
+ **out_kw,
11450
11587
  )
11451
11588
 
11452
11589
 
@@ -11454,6 +11591,9 @@ class SubprocessCommandExecutor(CommandExecutor[SubprocessCommand, SubprocessCom
11454
11591
  # ../deploy/conf/inject.py
11455
11592
 
11456
11593
 
11594
+ ##
11595
+
11596
+
11457
11597
  def bind_deploy_conf() -> InjectorBindings:
11458
11598
  lst: ta.List[InjectorBindingOrBindings] = [
11459
11599
  bind_deploy_manager(DeployConfManager),
@@ -11654,6 +11794,9 @@ class DeployGitManager(SingleDirDeployPathOwner):
11654
11794
  # ../deploy/paths/inject.py
11655
11795
 
11656
11796
 
11797
+ ##
11798
+
11799
+
11657
11800
  def bind_deploy_paths() -> InjectorBindings:
11658
11801
  lst: ta.List[InjectorBindingOrBindings] = [
11659
11802
  inj.bind_array(DeployPathOwner),
@@ -11677,6 +11820,9 @@ TODO:
11677
11820
  """
11678
11821
 
11679
11822
 
11823
+ ##
11824
+
11825
+
11680
11826
  class DeploySystemdManager:
11681
11827
  def __init__(
11682
11828
  self,
@@ -11902,6 +12048,9 @@ TODO:
11902
12048
  """
11903
12049
 
11904
12050
 
12051
+ ##
12052
+
12053
+
11905
12054
  @dc.dataclass(frozen=True)
11906
12055
  class SystemPackage:
11907
12056
  name: str
@@ -12020,6 +12169,9 @@ class YumSystemPackageManager(SystemPackageManager):
12020
12169
  # ../../../omdev/interp/providers/running.py
12021
12170
 
12022
12171
 
12172
+ ##
12173
+
12174
+
12023
12175
  class RunningInterpProvider(InterpProvider):
12024
12176
  @cached_nullary
12025
12177
  def version(self) -> InterpVersion:
@@ -12426,6 +12578,40 @@ class PyenvVersionInstaller:
12426
12578
  return exe
12427
12579
 
12428
12580
 
12581
+ ########################################
12582
+ # ../../../omdev/interp/uv/provider.py
12583
+ """
12584
+ uv run pip
12585
+ uv run --python 3.11.6 pip
12586
+ uv venv --python 3.11.6 --seed barf
12587
+ python3 -m venv barf && barf/bin/pip install uv && barf/bin/uv venv --python 3.11.6 --seed barf2
12588
+ """
12589
+
12590
+
12591
+ ##
12592
+
12593
+
12594
+ class UvInterpProvider(InterpProvider):
12595
+ def __init__(
12596
+ self,
12597
+ *,
12598
+ pyenv: Uv,
12599
+ inspector: InterpInspector,
12600
+ log: ta.Optional[logging.Logger] = None,
12601
+ ) -> None:
12602
+ super().__init__()
12603
+
12604
+ self._pyenv = pyenv
12605
+ self._inspector = inspector
12606
+ self._log = log
12607
+
12608
+ async def get_installed_versions(self, spec: InterpSpecifier) -> ta.Sequence[InterpVersion]:
12609
+ return []
12610
+
12611
+ async def get_installed_version(self, version: InterpVersion) -> Interp:
12612
+ raise NotImplementedError
12613
+
12614
+
12429
12615
  ########################################
12430
12616
  # ../commands/inject.py
12431
12617
 
@@ -12666,6 +12852,9 @@ class CheckSystemPackageCommandExecutor(CommandExecutor[CheckSystemPackageComman
12666
12852
  # ../../../omdev/interp/providers/inject.py
12667
12853
 
12668
12854
 
12855
+ ##
12856
+
12857
+
12669
12858
  def bind_interp_providers() -> InjectorBindings:
12670
12859
  lst: ta.List[InjectorBindingOrBindings] = [
12671
12860
  inj.bind_array(InterpProvider),
@@ -12685,6 +12874,9 @@ def bind_interp_providers() -> InjectorBindings:
12685
12874
  # ../../../omdev/interp/pyenv/provider.py
12686
12875
 
12687
12876
 
12877
+ ##
12878
+
12879
+
12688
12880
  class PyenvInterpProvider(InterpProvider):
12689
12881
  @dc.dataclass(frozen=True)
12690
12882
  class Options:
@@ -12812,6 +13004,24 @@ class PyenvInterpProvider(InterpProvider):
12812
13004
  return Interp(exe, version)
12813
13005
 
12814
13006
 
13007
+ ########################################
13008
+ # ../../../omdev/interp/uv/inject.py
13009
+
13010
+
13011
+ ##
13012
+
13013
+
13014
+ def bind_interp_uv() -> InjectorBindings:
13015
+ lst: ta.List[InjectorBindingOrBindings] = [
13016
+ inj.bind(Uv, singleton=True),
13017
+
13018
+ inj.bind(UvInterpProvider, singleton=True),
13019
+ inj.bind(InterpProvider, to_key=UvInterpProvider, array=True),
13020
+ ]
13021
+
13022
+ return inj.as_bindings(*lst)
13023
+
13024
+
12815
13025
  ########################################
12816
13026
  # ../remote/inject.py
12817
13027
 
@@ -12844,6 +13054,9 @@ def bind_remote(
12844
13054
  # ../system/inject.py
12845
13055
 
12846
13056
 
13057
+ ##
13058
+
13059
+
12847
13060
  def bind_system(
12848
13061
  *,
12849
13062
  system_config: SystemConfig,
@@ -13033,6 +13246,9 @@ class SshManageTargetConnector(ManageTargetConnector):
13033
13246
  # ../../../omdev/interp/pyenv/inject.py
13034
13247
 
13035
13248
 
13249
+ ##
13250
+
13251
+
13036
13252
  def bind_interp_pyenv() -> InjectorBindings:
13037
13253
  lst: ta.List[InjectorBindingOrBindings] = [
13038
13254
  inj.bind(Pyenv, singleton=True),
@@ -13077,6 +13293,9 @@ def bind_targets() -> InjectorBindings:
13077
13293
  # ../../../omdev/interp/inject.py
13078
13294
 
13079
13295
 
13296
+ ##
13297
+
13298
+
13080
13299
  def bind_interp() -> InjectorBindings:
13081
13300
  lst: ta.List[InjectorBindingOrBindings] = [
13082
13301
  bind_interp_providers(),
@@ -13096,6 +13315,7 @@ def bind_interp() -> InjectorBindings:
13096
13315
  injector.provide(c)
13097
13316
  for c in [
13098
13317
  PyenvInterpProvider,
13318
+ UvInterpProvider,
13099
13319
  RunningInterpProvider,
13100
13320
  SystemInterpProvider,
13101
13321
  ]
@@ -13118,6 +13338,9 @@ def bind_interp() -> InjectorBindings:
13118
13338
  # ../../../omdev/interp/default.py
13119
13339
 
13120
13340
 
13341
+ ##
13342
+
13343
+
13121
13344
  @cached_nullary
13122
13345
  def get_default_interp_resolver() -> InterpResolver:
13123
13346
  return inj.create_injector(bind_interp())[InterpResolver]
@@ -13162,6 +13385,9 @@ TODO:
13162
13385
  """
13163
13386
 
13164
13387
 
13388
+ ##
13389
+
13390
+
13165
13391
  class DeployVenvManager:
13166
13392
  async def setup_venv(
13167
13393
  self,
@@ -13207,6 +13433,9 @@ class DeployVenvManager:
13207
13433
  # ../deploy/apps.py
13208
13434
 
13209
13435
 
13436
+ ##
13437
+
13438
+
13210
13439
  class DeployAppManager(DeployPathOwner):
13211
13440
  def __init__(
13212
13441
  self,
@@ -5,7 +5,7 @@
5
5
  # @omlish-generated
6
6
  # @omlish-amalg-output ../supervisor/main.py
7
7
  # @omlish-git-diff-omit
8
- # ruff: noqa: N802 UP006 UP007 UP012 UP036 UP045
8
+ # ruff: noqa: N802 UP006 UP007 UP012 UP036 UP043 UP045
9
9
  #
10
10
  # Supervisor is Copyright (c) 2006-2015 Agendaless Consulting and Contributors.
11
11
  # (http://www.agendaless.com), All Rights Reserved
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ominfra
3
- Version: 0.0.0.dev356
3
+ Version: 0.0.0.dev357
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.dev356
16
- Requires-Dist: omlish==0.0.0.dev356
15
+ Requires-Dist: omdev==0.0.0.dev357
16
+ Requires-Dist: omlish==0.0.0.dev357
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.21; extra == "all"
@@ -1,7 +1,7 @@
1
1
  ominfra/.manifests.json,sha256=8KREXxMAlsilZOktXPYru1ND3V5hFI22vnrp6hT3bio,589
2
2
  ominfra/__about__.py,sha256=Cb4OinET2BZACWkjdR97ihmUdjDcQBe_qF2VcJ0tey4,705
3
3
  ominfra/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- ominfra/pyremote.py,sha256=vdeIbvuqIXfiPPVmsD-eb-HSL6yStvVQ9MIwYJI1XT4,16168
4
+ ominfra/pyremote.py,sha256=hCoh0m-yxAoHOTB_tG8nwqq_CEXxIF0MTZ0A5eaZcSM,16529
5
5
  ominfra/systemd.py,sha256=-tk4qeQF9py98AtK5VVGYwcgQ_mJPanEWbemoU-nmbY,1028
6
6
  ominfra/threadworkers.py,sha256=We6wkoq-cd0DRAxS0z5bUXQKtSwwfcHNZqRuIU57doU,4980
7
7
  ominfra/clouds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -57,64 +57,64 @@ ominfra/manage/marshal.py,sha256=WKj7IU9bo4fBMSSzT6ZMm_WFalXIJZ-V7j8oi92fNhk,305
57
57
  ominfra/manage/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
58
  ominfra/manage/commands/base.py,sha256=8wXSlvihd4GBwYa05HZ9QD2-uiH7dUqEG0uP6flxuJQ,3999
59
59
  ominfra/manage/commands/inject.py,sha256=ixQVuKN808dTSqHp5V-MUIgDHw5jVei8BnEy-bE4tDY,2960
60
- ominfra/manage/commands/injection.py,sha256=GcchG_-pzFb09b159SKdcjFcGpPusP2x-eFAfqsw59s,841
61
- ominfra/manage/commands/local.py,sha256=3zQ_Y7j4DfZAP4gNS9FbbV7Vkylw8ifglVWBM3qxh8k,538
62
- ominfra/manage/commands/marshal.py,sha256=Xl_yRgCD94yDmAx6e2uKVRjkmhV5EOr-Akqo3C0DGXw,689
60
+ ominfra/manage/commands/injection.py,sha256=6jVPO2mhaorVfe7vAv8EQQSkxgEZhu-NZHpK37JlKc0,846
61
+ ominfra/manage/commands/local.py,sha256=dESeaFeQAiWMCx62wfaqbJlJF6kALKi6Fzy1M5H-H3A,543
62
+ ominfra/manage/commands/marshal.py,sha256=k3MmlHy4ibQjaZwMNcjvjjMsjdegn0XWTnJ6XLSDJ2c,694
63
63
  ominfra/manage/commands/ping.py,sha256=DVZFzL1Z_f-Bq53vxMrL3xOi0iK_nMonJE4KvQf9wsI,546
64
- ominfra/manage/commands/subprocess.py,sha256=4GSKrozxp2RosO71FjAaTUySSDEWrEclPq7ATZF2ATc,2461
64
+ ominfra/manage/commands/subprocess.py,sha256=UjoZA_csQ5ksb1ZPSByP9noS5920DOvQg1SqDBxFusg,3892
65
65
  ominfra/manage/commands/types.py,sha256=tEufI13T1j1Ji2p2APNpPfBz4pFI2KiFv5ady9UXdXI,216
66
66
  ominfra/manage/deploy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
- ominfra/manage/deploy/apps.py,sha256=2DiuXPBr9RB2gS45sA3gP4Y7AoReABP-gQlIiXvXYMg,4871
67
+ ominfra/manage/deploy/apps.py,sha256=PcBkx-3PGTdP7kpKD2Sk401HljQVcHcrAbXfP4dh0G8,4876
68
68
  ominfra/manage/deploy/commands.py,sha256=gGrw7JNkPrxAh_x5-ih1_XG6kGhoqPwRD1wjdaNUSR8,836
69
69
  ominfra/manage/deploy/config.py,sha256=EsDzSvUzNrFT32tL53xIY2MSKstTrf-L7sBtedYAlDw,120
70
70
  ominfra/manage/deploy/deploy.py,sha256=naI0vH5MQNiSu3go9y35k-C9rGUfvz_V246oJ_HOUr8,8972
71
71
  ominfra/manage/deploy/git.py,sha256=D3mdEM5LifnAfAVPVwAIZYc5X0A4A7lyF46diheqBW8,5539
72
72
  ominfra/manage/deploy/inject.py,sha256=el2GPkY7uV_2_PIlMwT9FnY-QGQQPUL8U3OzR0bvh1o,3478
73
- ominfra/manage/deploy/injection.py,sha256=WbxBu7K7P2Wvp_p-BYhujSC2B9UhwhOjPYxLvfhDrX4,398
73
+ ominfra/manage/deploy/injection.py,sha256=88zkzgtAY2Rg6qaXqSa555W7RMMYglWXdfZNlKs2a4Q,403
74
74
  ominfra/manage/deploy/interp.py,sha256=IRM-_r1PWtcrjennC02jbWF6xWsBhxDMQG_6bJ6o3v0,1043
75
- ominfra/manage/deploy/nginx.py,sha256=Ee-j2vxjIwpZXRr6anr7wj2GuhzAQwQ6MO67XUH60zU,95
75
+ ominfra/manage/deploy/nginx.py,sha256=L_1txY0z4HPAXjz9qkjwM8gT1X16zKCq77Nfp5_F79k,100
76
76
  ominfra/manage/deploy/specs.py,sha256=q3_tfzkVB6bXQ4cNobIRTYoSPFCUFAo_4R71nL9tPfE,2899
77
- ominfra/manage/deploy/systemd.py,sha256=PS1k3Wc7iFaLISJdKw2s_F5lMEdNfwEqFh-aVVwYXDo,3618
77
+ ominfra/manage/deploy/systemd.py,sha256=5P8QTJ0Oa1PBDja8oljfmaQBetObS1bD9QkwsWNOiuc,3623
78
78
  ominfra/manage/deploy/tags.py,sha256=Z0uIbiEEGxWtqytMR6QyAquBDRtQBT0apNZB3kHj2Z4,5124
79
- ominfra/manage/deploy/tmp.py,sha256=KcFl_NY3CKB8uI2S1h82vt5TQXTdE6qQWJGKKm1As1Q,735
79
+ ominfra/manage/deploy/tmp.py,sha256=E-59X9KzV4wXXNr7J4_NbRX8N5EPOo7KL-hRw9pZ6yY,740
80
80
  ominfra/manage/deploy/types.py,sha256=ZcIoheZ3zW7n0IZiqTRW_Uo3JyWWeWg5nyKGryvGc2I,112
81
- ominfra/manage/deploy/venvs.py,sha256=tA82cxD68OOqXBf99IldlFv2vWBvS-rL9wR90TefcAc,1702
81
+ ominfra/manage/deploy/venvs.py,sha256=QES260A0QbX1YIY7cXxFbSlzXcWGfH05cilZ3fEx0CE,1707
82
82
  ominfra/manage/deploy/conf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- ominfra/manage/deploy/conf/inject.py,sha256=V9ISuvRCu0X5TqrmBjhRnCNZ5vHaTek8FwCr8tkCBtI,459
83
+ ominfra/manage/deploy/conf/inject.py,sha256=MWN56HbSBK57WrU4nznJk4lJbQjM4NKwp6VhlKmiqac,464
84
84
  ominfra/manage/deploy/conf/manager.py,sha256=ktLS1sAuVVR0quevr3tEc77q6shGuAcBSmfYO4YHPEw,8328
85
85
  ominfra/manage/deploy/conf/specs.py,sha256=KwvppmSpAL-ieTk4zOF85wCJovMypAHTMv7daEvnahA,2197
86
86
  ominfra/manage/deploy/paths/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
- ominfra/manage/deploy/paths/inject.py,sha256=zDMEncGA8e5NtiqdDmuG7fMSbK94VR6Um4GgBqDZ664,602
88
- ominfra/manage/deploy/paths/manager.py,sha256=t29go-6lPMFsiRiWv-x49IpjbVIV3bWDVg6L3_fnItc,935
89
- ominfra/manage/deploy/paths/owners.py,sha256=F-2evqFoGjze_HXHWJgga4LLwbXTL5DxNswtLZlKwpU,1235
87
+ ominfra/manage/deploy/paths/inject.py,sha256=WZarL7SizE3GR1n1atHXeudBXd2A4R_2-w6iPWuXkG0,607
88
+ ominfra/manage/deploy/paths/manager.py,sha256=RRgMPJ9gMrEFsU0Dezbls45M6kjmvKzAqRo9vmDWj-w,940
89
+ ominfra/manage/deploy/paths/owners.py,sha256=Cb_80BBrsUo6Rm0tWTljjEScoCHL0PWbLGvWlvqBZl8,1240
90
90
  ominfra/manage/deploy/paths/paths.py,sha256=8_RVgHctv_Lj4v7FjxMDSXcayXaIo_CRMwhIBRUQ2iQ,5643
91
- ominfra/manage/deploy/paths/specs.py,sha256=bmGD9OsWL1VvzTPTeDoB8HEE0fYFfSU246ocUOFjVoo,250
91
+ ominfra/manage/deploy/paths/specs.py,sha256=HDP1XLKHJx1NwpJZuGikirmkHoFPYHX6Myn_Vd03CVQ,255
92
92
  ominfra/manage/deploy/paths/types.py,sha256=WyQA5DlM5vKZnGXZouunuLTPl3KV7ktaez_sqoC5clY,118
93
93
  ominfra/manage/remote/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
94
  ominfra/manage/remote/_main.py,sha256=UIp_Xalp8FP-p1cSe3uO7TPJrJEUnbPrNWIZRJDmg-s,4362
95
95
  ominfra/manage/remote/channel.py,sha256=6eYzQfmTRN4nvQyFOt37EKPjUQ10Bbu8d6Zq4cpWhNc,2230
96
- ominfra/manage/remote/config.py,sha256=4IvyRgQY6OkmPCFP0BXWwMr3iaZbVF56ZH8z3X5oH4I,479
97
- ominfra/manage/remote/connection.py,sha256=1Q6a96oTZuMzZzbvRnbqVTSLp2TNKJFK_twHMi3WTiw,3801
96
+ ominfra/manage/remote/config.py,sha256=0tgfTJKa2Cy2nzl2j3allYyMIEsAwhIlF02v9ke-990,484
97
+ ominfra/manage/remote/connection.py,sha256=vciH5wtzXN7g-B6hlR97m886YSflbnDASLUDjz5mq7Q,3807
98
98
  ominfra/manage/remote/execution.py,sha256=0r34APS4YYvUqWijBQa3HizoNJ5U9PAdu5L9mSHPrsE,11744
99
99
  ominfra/manage/remote/inject.py,sha256=7upiQPMa_JkcdHgYyJjmbppIy3E2ne7IxJ_EZuIQllQ,1086
100
- ominfra/manage/remote/payload.py,sha256=Rfkha76G23Lh2kvYc3oWRCfyMyuXLheN9-jwMNhl6sA,950
101
- ominfra/manage/remote/spawning.py,sha256=Oq9sUmOXx6eIOuU5dSqq6UDAFL8XdmItyMjObvgYC_Q,3312
100
+ ominfra/manage/remote/payload.py,sha256=QVNz7bBBWKLdXPuIGfQ0FW1rWE8nrBEE5Q9cLgF8FwU,955
101
+ ominfra/manage/remote/spawning.py,sha256=jjReGjsW4MWq5wecrPBLg-4leCVeris04HvctWTnegA,3318
102
102
  ominfra/manage/system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
103
  ominfra/manage/system/commands.py,sha256=VN-nthJB4LYwsDvPNmc_mYe4XyWnStAi7SLZGaEPZCA,1179
104
- ominfra/manage/system/config.py,sha256=gn7oImD1sXDVrJusSCuLnWo6qzlA4iq3ZtiwsVMtpTA,202
105
- ominfra/manage/system/inject.py,sha256=2HwR0n5zgK6HQWqO_M_-1S4iyJ7YoFkygqhU-QAjmuc,1880
106
- ominfra/manage/system/packages.py,sha256=qvU7jKFr5ChoMoKs_9aoc-rtSOIwUZ-OzrytTFXzXZE,4620
104
+ ominfra/manage/system/config.py,sha256=Ql-kCV4BVsgmMh08SrxJ7YW-BCLviOJM-cpoZ2gBIL0,207
105
+ ominfra/manage/system/inject.py,sha256=i1yCAnmhN_mUe9CY2YdNT0GBipo7WED_vncWbZFvF3c,1885
106
+ ominfra/manage/system/packages.py,sha256=xe_JNv5rTPlqKGfkiB9iDmH-bAEdvQ0yeFiY6mPVTKc,4641
107
107
  ominfra/manage/system/platforms.py,sha256=F0bgYzUzCjZ2LbWVvnEq2ya_X_LfRW406LQYFL7bG44,1202
108
108
  ominfra/manage/targets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
109
  ominfra/manage/targets/bestpython.py,sha256=6_CH_Vm9Am5aD5UV3m8uC-B8bvMNSjVIWicPmFw0aLI,631
110
110
  ominfra/manage/targets/bestpython.sh,sha256=RTvImgsRv-67D9Ugg5bo7NfpV2MD8zTsLt6aipdLQiQ,350
111
- ominfra/manage/targets/connection.py,sha256=a5gIe9MIQi2q_JTNAVbO4kZMresWglC4TvOA1RrYYcg,5022
111
+ ominfra/manage/targets/connection.py,sha256=Ut-R_PvQN9tPBacZD0ODmLIYvLsgS51qvOGrNgAyiEo,5028
112
112
  ominfra/manage/targets/inject.py,sha256=WhkEAB5BFWtENnVMmuiy9eoBNd6jBPSGZsWjT_9_7JA,1567
113
113
  ominfra/manage/targets/targets.py,sha256=WmasYmL6xfAI7F0XvDhScFdBVxkqPkmo_gRgABmmkGA,1891
114
114
  ominfra/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
- ominfra/scripts/journald2aws.py,sha256=7bZWgNeZuTAs6fBl4XBApOfJt4pg_iykoUsjuzX29wc,171893
116
- ominfra/scripts/manage.py,sha256=Jm6-X8kVySJv5fVj6sIwJa4V8tEOhyfYCAc7lw89Tyk,385567
117
- ominfra/scripts/supervisor.py,sha256=lvYjMMIxM32xehKBWTqLFAi5Ee6rYimc33QTKvM2SxQ,304398
115
+ ominfra/scripts/journald2aws.py,sha256=qV9yL8xZSPd2Ec2ZY67rhGQQ9ZzeOafuwu9cBALQVik,171899
116
+ ominfra/scripts/manage.py,sha256=8oZbE87PcWLbUKtiKEQRIMQsg2RYeGr-uP_vhgu64Ac,390105
117
+ ominfra/scripts/supervisor.py,sha256=xF-GynxXERKfUkP9P_AREDt4Ggxj5MTiNgiz-FJkK6I,304404
118
118
  ominfra/supervisor/LICENSE.txt,sha256=ZrHY15PVR98y26Yg6iQfa-SXnUaYTDhrUsPVcEO5OKM,1874
119
119
  ominfra/supervisor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
120
120
  ominfra/supervisor/__main__.py,sha256=I0yFw-C08OOiZ3BF6lF1Oiv789EQXu-_j6whDhQUTEA,66
@@ -156,9 +156,9 @@ ominfra/tailscale/api.py,sha256=C5-t_b6jZXUWcy5k8bXm7CFnk73pSdrlMOgGDeGVrpw,1370
156
156
  ominfra/tailscale/cli.py,sha256=zRV7-tKB7kBah1oTVZlol-vwx1FBlnfzYAPGkeU5jX4,3543
157
157
  ominfra/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
158
158
  ominfra/tools/listresources.py,sha256=auGP1LlbBJSFKUWNvQo_UzA8IsBNZBTMwEkFFRJ4FX4,6185
159
- ominfra-0.0.0.dev356.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
160
- ominfra-0.0.0.dev356.dist-info/METADATA,sha256=GAr7_DGY3nWzucTryV-ydildvowNOFO6EXNHMdD-tUg,753
161
- ominfra-0.0.0.dev356.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
162
- ominfra-0.0.0.dev356.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
163
- ominfra-0.0.0.dev356.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
164
- ominfra-0.0.0.dev356.dist-info/RECORD,,
159
+ ominfra-0.0.0.dev357.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
160
+ ominfra-0.0.0.dev357.dist-info/METADATA,sha256=OPD_Ml1F-Or7UJT4H-uvQWNPglktwUfpIzlcSJw0GZM,753
161
+ ominfra-0.0.0.dev357.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
162
+ ominfra-0.0.0.dev357.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
163
+ ominfra-0.0.0.dev357.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
164
+ ominfra-0.0.0.dev357.dist-info/RECORD,,