ominfra 0.0.0.dev132__py3-none-any.whl → 0.0.0.dev134__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 (40) hide show
  1. ominfra/{deploy → manage/deploy}/_executor.py +10 -10
  2. ominfra/{deploy → manage/deploy}/poly/_main.py +6 -6
  3. ominfra/{deploy → manage/deploy}/remote.py +1 -1
  4. ominfra/pyremote.py +389 -0
  5. ominfra/scripts/supervisor.py +1 -1
  6. ominfra/supervisor/http.py +1 -1
  7. {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev134.dist-info}/METADATA +3 -3
  8. {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev134.dist-info}/RECORD +36 -39
  9. ominfra/pyremote/__init__.py +0 -0
  10. ominfra/pyremote/_runcommands.py +0 -1201
  11. ominfra/pyremote/bootstrap.py +0 -149
  12. ominfra/pyremote/runcommands.py +0 -56
  13. /ominfra/{deploy → manage/deploy}/__init__.py +0 -0
  14. /ominfra/{deploy → manage/deploy}/configs.py +0 -0
  15. /ominfra/{deploy → manage/deploy}/executor/__init__.py +0 -0
  16. /ominfra/{deploy → manage/deploy}/executor/base.py +0 -0
  17. /ominfra/{deploy → manage/deploy}/executor/concerns/__init__.py +0 -0
  18. /ominfra/{deploy → manage/deploy}/executor/concerns/dirs.py +0 -0
  19. /ominfra/{deploy → manage/deploy}/executor/concerns/nginx.py +0 -0
  20. /ominfra/{deploy → manage/deploy}/executor/concerns/repo.py +0 -0
  21. /ominfra/{deploy → manage/deploy}/executor/concerns/supervisor.py +0 -0
  22. /ominfra/{deploy → manage/deploy}/executor/concerns/systemd.py +0 -0
  23. /ominfra/{deploy → manage/deploy}/executor/concerns/user.py +0 -0
  24. /ominfra/{deploy → manage/deploy}/executor/concerns/venv.py +0 -0
  25. /ominfra/{deploy → manage/deploy}/executor/main.py +0 -0
  26. /ominfra/{deploy → manage/deploy}/poly/__init__.py +0 -0
  27. /ominfra/{deploy → manage/deploy}/poly/base.py +0 -0
  28. /ominfra/{deploy → manage/deploy}/poly/configs.py +0 -0
  29. /ominfra/{deploy → manage/deploy}/poly/deploy.py +0 -0
  30. /ominfra/{deploy → manage/deploy}/poly/main.py +0 -0
  31. /ominfra/{deploy → manage/deploy}/poly/nginx.py +0 -0
  32. /ominfra/{deploy → manage/deploy}/poly/repo.py +0 -0
  33. /ominfra/{deploy → manage/deploy}/poly/runtime.py +0 -0
  34. /ominfra/{deploy → manage/deploy}/poly/site.py +0 -0
  35. /ominfra/{deploy → manage/deploy}/poly/supervisor.py +0 -0
  36. /ominfra/{deploy → manage/deploy}/poly/venv.py +0 -0
  37. {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev134.dist-info}/LICENSE +0 -0
  38. {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev134.dist-info}/WHEEL +0 -0
  39. {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev134.dist-info}/entry_points.txt +0 -0
  40. {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev134.dist-info}/top_level.txt +0 -0
@@ -82,10 +82,10 @@ if sys.version_info < (3, 8):
82
82
  ########################################
83
83
 
84
84
 
85
- # ../../../omlish/lite/cached.py
85
+ # ../../../../omlish/lite/cached.py
86
86
  T = ta.TypeVar('T')
87
87
 
88
- # ../../../omlish/lite/check.py
88
+ # ../../../../omlish/lite/check.py
89
89
  SizedT = ta.TypeVar('SizedT', bound=ta.Sized)
90
90
 
91
91
 
@@ -112,7 +112,7 @@ class HostConfig:
112
112
 
113
113
 
114
114
  ########################################
115
- # ../../../../omlish/lite/cached.py
115
+ # ../../../../../omlish/lite/cached.py
116
116
 
117
117
 
118
118
  class _cached_nullary: # noqa
@@ -137,7 +137,7 @@ def cached_nullary(fn): # ta.Callable[..., T]) -> ta.Callable[..., T]:
137
137
 
138
138
 
139
139
  ########################################
140
- # ../../../../omlish/lite/check.py
140
+ # ../../../../../omlish/lite/check.py
141
141
 
142
142
 
143
143
  def check_isinstance(v: ta.Any, spec: ta.Union[ta.Type[T], tuple]) -> T:
@@ -234,7 +234,7 @@ def check_non_empty(v: SizedT) -> SizedT:
234
234
 
235
235
 
236
236
  ########################################
237
- # ../../../../omlish/lite/json.py
237
+ # ../../../../../omlish/lite/json.py
238
238
 
239
239
 
240
240
  ##
@@ -265,7 +265,7 @@ json_dumps_compact: ta.Callable[..., str] = functools.partial(json.dumps, **JSON
265
265
 
266
266
 
267
267
  ########################################
268
- # ../../../../omlish/lite/reflect.py
268
+ # ../../../../../omlish/lite/reflect.py
269
269
 
270
270
 
271
271
  _GENERIC_ALIAS_TYPES = (
@@ -320,7 +320,7 @@ def deep_subclasses(cls: ta.Type[T]) -> ta.Iterator[ta.Type[T]]:
320
320
 
321
321
 
322
322
  ########################################
323
- # ../../../../omlish/lite/logs.py
323
+ # ../../../../../omlish/lite/logs.py
324
324
  """
325
325
  TODO:
326
326
  - translate json keys
@@ -590,7 +590,7 @@ def configure_standard_logging(
590
590
 
591
591
 
592
592
  ########################################
593
- # ../../../../omlish/lite/marshal.py
593
+ # ../../../../../omlish/lite/marshal.py
594
594
  """
595
595
  TODO:
596
596
  - pickle stdlib objs? have to pin to 3.8 pickle protocol, will be cross-version
@@ -934,7 +934,7 @@ def unmarshal_obj(o: ta.Any, ty: ta.Union[ta.Type[T], ta.Any]) -> T:
934
934
 
935
935
 
936
936
  ########################################
937
- # ../../../../omlish/lite/runtime.py
937
+ # ../../../../../omlish/lite/runtime.py
938
938
 
939
939
 
940
940
  @cached_nullary
@@ -951,7 +951,7 @@ def check_runtime_version() -> None:
951
951
 
952
952
 
953
953
  ########################################
954
- # ../../../../omlish/lite/subprocesses.py
954
+ # ../../../../../omlish/lite/subprocesses.py
955
955
 
956
956
 
957
957
  ##
@@ -33,7 +33,7 @@ if sys.version_info < (3, 8):
33
33
  ########################################
34
34
 
35
35
 
36
- # ../../../omlish/lite/cached.py
36
+ # ../../../../omlish/lite/cached.py
37
37
  T = ta.TypeVar('T')
38
38
 
39
39
  # base.py
@@ -84,7 +84,7 @@ class DeployConfig:
84
84
 
85
85
 
86
86
  ########################################
87
- # ../../../../omlish/lite/cached.py
87
+ # ../../../../../omlish/lite/cached.py
88
88
 
89
89
 
90
90
  class _cached_nullary: # noqa
@@ -109,7 +109,7 @@ def cached_nullary(fn): # ta.Callable[..., T]) -> ta.Callable[..., T]:
109
109
 
110
110
 
111
111
  ########################################
112
- # ../../../../omlish/lite/json.py
112
+ # ../../../../../omlish/lite/json.py
113
113
 
114
114
 
115
115
  ##
@@ -301,7 +301,7 @@ class Deploy(ConcernsContainer[DeployConcern, DeployConfig]):
301
301
 
302
302
 
303
303
  ########################################
304
- # ../../../../omlish/lite/logs.py
304
+ # ../../../../../omlish/lite/logs.py
305
305
  """
306
306
  TODO:
307
307
  - translate json keys
@@ -571,7 +571,7 @@ def configure_standard_logging(
571
571
 
572
572
 
573
573
  ########################################
574
- # ../../../../omlish/lite/runtime.py
574
+ # ../../../../../omlish/lite/runtime.py
575
575
 
576
576
 
577
577
  @cached_nullary
@@ -708,7 +708,7 @@ class SiteImpl(Site):
708
708
 
709
709
 
710
710
  ########################################
711
- # ../../../../omlish/lite/subprocesses.py
711
+ # ../../../../../omlish/lite/subprocesses.py
712
712
 
713
713
 
714
714
  ##
@@ -23,7 +23,7 @@ import tempfile
23
23
 
24
24
  from omlish import check
25
25
 
26
- from .. import cmds
26
+ from ... import cmds
27
27
 
28
28
 
29
29
  def render_script(*cs: list[str] | tuple[str, ...]) -> str:
ominfra/pyremote.py ADDED
@@ -0,0 +1,389 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
3
+ """
4
+ Basically this: https://mitogen.networkgenomics.com/howitworks.html
5
+ """
6
+ import base64
7
+ import dataclasses as dc
8
+ import inspect
9
+ import json
10
+ import os
11
+ import platform
12
+ import pwd
13
+ import site
14
+ import struct
15
+ import sys
16
+ import textwrap
17
+ import typing as ta
18
+ import zlib
19
+
20
+
21
+ ##
22
+
23
+
24
+ _PYREMOTE_BOOTSTRAP_COMM_FD = 100
25
+ _PYREMOTE_BOOTSTRAP_SRC_FD = 101
26
+
27
+ _PYREMOTE_BOOTSTRAP_CHILD_PID_VAR = '_OPYR_CPID'
28
+ _PYREMOTE_BOOTSTRAP_ARGV0_VAR = '_OPYR_ARGV0'
29
+
30
+ _PYREMOTE_BOOTSTRAP_ACK0 = b'OPYR000\n'
31
+ _PYREMOTE_BOOTSTRAP_ACK1 = b'OPYR001\n'
32
+ _PYREMOTE_BOOTSTRAP_ACK2 = b'OPYR002\n'
33
+ _PYREMOTE_BOOTSTRAP_ACK3 = b'OPYR003\n'
34
+
35
+ _PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT = '(pyremote:%s)'
36
+
37
+ _PYREMOTE_BOOTSTRAP_IMPORTS = [
38
+ 'base64',
39
+ 'os',
40
+ 'struct',
41
+ 'sys',
42
+ 'zlib',
43
+ ]
44
+
45
+
46
+ def _pyremote_bootstrap_main(context_name: str) -> None:
47
+ # Get pid
48
+ pid = os.getpid()
49
+
50
+ # Two copies of main src to be sent to parent
51
+ r0, w0 = os.pipe()
52
+ r1, w1 = os.pipe()
53
+
54
+ if (cp := os.fork()):
55
+ # Parent process
56
+
57
+ # Dup original stdin to comm_fd for use as comm channel
58
+ os.dup2(0, _PYREMOTE_BOOTSTRAP_COMM_FD)
59
+
60
+ # Overwrite stdin (fed to python repl) with first copy of src
61
+ os.dup2(r0, 0)
62
+
63
+ # Dup second copy of src to src_fd to recover after launch
64
+ os.dup2(r1, _PYREMOTE_BOOTSTRAP_SRC_FD)
65
+
66
+ # Close remaining fd's
67
+ for f in [r0, w0, r1, w1]:
68
+ os.close(f)
69
+
70
+ # Save child pid to close after relaunch
71
+ os.environ[_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR] = str(cp)
72
+
73
+ # Save original argv0
74
+ os.environ[_PYREMOTE_BOOTSTRAP_ARGV0_VAR] = sys.executable
75
+
76
+ # Start repl reading stdin from r0
77
+ os.execl(sys.executable, sys.executable + (_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT % (context_name,)))
78
+
79
+ else:
80
+ # Child process
81
+
82
+ # Write first ack
83
+ os.write(1, _PYREMOTE_BOOTSTRAP_ACK0)
84
+
85
+ # Write pid
86
+ os.write(1, struct.pack('<Q', pid))
87
+
88
+ # Read main src from stdin
89
+ main_z_len = struct.unpack('<I', os.read(0, 4))[0]
90
+ main_src = zlib.decompress(os.fdopen(0, 'rb').read(main_z_len))
91
+
92
+ # Write both copies of main src. Must write to w0 (parent stdin) before w1 (copy pipe) as pipe will likely fill
93
+ # and block and need to be drained by pyremote_bootstrap_finalize running in parent.
94
+ for w in [w0, w1]:
95
+ fp = os.fdopen(w, 'wb', 0)
96
+ fp.write(main_src)
97
+ fp.close()
98
+
99
+ # Write second ack
100
+ os.write(1, _PYREMOTE_BOOTSTRAP_ACK1)
101
+
102
+ # Exit child
103
+ sys.exit(0)
104
+
105
+
106
+ ##
107
+
108
+
109
+ def pyremote_build_bootstrap_cmd(context_name: str) -> str:
110
+ bs_src = textwrap.dedent(inspect.getsource(_pyremote_bootstrap_main))
111
+
112
+ for gl in [
113
+ '_PYREMOTE_BOOTSTRAP_COMM_FD',
114
+ '_PYREMOTE_BOOTSTRAP_SRC_FD',
115
+
116
+ '_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR',
117
+ '_PYREMOTE_BOOTSTRAP_ARGV0_VAR',
118
+
119
+ '_PYREMOTE_BOOTSTRAP_ACK0',
120
+ '_PYREMOTE_BOOTSTRAP_ACK1',
121
+
122
+ '_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT',
123
+ ]:
124
+ bs_src = bs_src.replace(gl, repr(globals()[gl]))
125
+
126
+ bs_src = '\n'.join(
127
+ cl
128
+ for l in bs_src.splitlines()
129
+ if (cl := (l.split('#')[0]).rstrip())
130
+ if cl.strip()
131
+ )
132
+
133
+ bs_z = zlib.compress(bs_src.encode('utf-8'))
134
+ bs_z64 = base64.encodebytes(bs_z).replace(b'\n', b'')
135
+
136
+ stmts = [
137
+ f'import {", ".join(_PYREMOTE_BOOTSTRAP_IMPORTS)}',
138
+ f'exec(zlib.decompress(base64.decodebytes({bs_z64!r})))',
139
+ f'_pyremote_bootstrap_main({context_name!r})',
140
+ ]
141
+
142
+ cmd = '; '.join(stmts)
143
+ return cmd
144
+
145
+
146
+ ##
147
+
148
+
149
+ @dc.dataclass(frozen=True)
150
+ class PyremoteEnvInfo:
151
+ sys_base_prefix: str
152
+ sys_byteorder: str
153
+ sys_defaultencoding: str
154
+ sys_exec_prefix: str
155
+ sys_executable: str
156
+ sys_implementation_name: str
157
+ sys_path: ta.List[str]
158
+ sys_platform: str
159
+ sys_prefix: str
160
+ sys_version: str
161
+ sys_version_info: ta.List[ta.Union[int, str]]
162
+
163
+ platform_architecture: ta.List[str]
164
+ platform_machine: str
165
+ platform_platform: str
166
+ platform_processor: str
167
+ platform_system: str
168
+ platform_release: str
169
+ platform_version: str
170
+
171
+ site_userbase: str
172
+
173
+ os_cwd: str
174
+ os_gid: int
175
+ os_loadavg: ta.List[float]
176
+ os_login: ta.Optional[str]
177
+ os_pgrp: int
178
+ os_pid: int
179
+ os_ppid: int
180
+ os_uid: int
181
+
182
+ pw_name: str
183
+ pw_uid: int
184
+ pw_gid: int
185
+ pw_gecos: str
186
+ pw_dir: str
187
+ pw_shell: str
188
+
189
+ env_path: ta.Optional[str]
190
+
191
+
192
+ def _get_pyremote_env_info() -> PyremoteEnvInfo:
193
+ os_uid = os.getuid()
194
+
195
+ pw = pwd.getpwuid(os_uid)
196
+
197
+ os_login: ta.Optional[str]
198
+ try:
199
+ os_login = os.getlogin()
200
+ except OSError:
201
+ os_login = None
202
+
203
+ return PyremoteEnvInfo(
204
+ sys_base_prefix=sys.base_prefix,
205
+ sys_byteorder=sys.byteorder,
206
+ sys_defaultencoding=sys.getdefaultencoding(),
207
+ sys_exec_prefix=sys.exec_prefix,
208
+ sys_executable=sys.executable,
209
+ sys_implementation_name=sys.implementation.name,
210
+ sys_path=sys.path,
211
+ sys_platform=sys.platform,
212
+ sys_prefix=sys.prefix,
213
+ sys_version=sys.version,
214
+ sys_version_info=list(sys.version_info),
215
+
216
+ platform_architecture=list(platform.architecture()),
217
+ platform_machine=platform.machine(),
218
+ platform_platform=platform.platform(),
219
+ platform_processor=platform.processor(),
220
+ platform_system=platform.system(),
221
+ platform_release=platform.release(),
222
+ platform_version=platform.version(),
223
+
224
+ site_userbase=site.getuserbase(),
225
+
226
+ os_cwd=os.getcwd(),
227
+ os_gid=os.getgid(),
228
+ os_loadavg=list(os.getloadavg()),
229
+ os_login=os_login,
230
+ os_pgrp=os.getpgrp(),
231
+ os_pid=os.getpid(),
232
+ os_ppid=os.getppid(),
233
+ os_uid=os_uid,
234
+
235
+ pw_name=pw.pw_name,
236
+ pw_uid=pw.pw_uid,
237
+ pw_gid=pw.pw_gid,
238
+ pw_gecos=pw.pw_gecos,
239
+ pw_dir=pw.pw_dir,
240
+ pw_shell=pw.pw_shell,
241
+
242
+ env_path=os.environ.get('PATH'),
243
+ )
244
+
245
+
246
+ ##
247
+
248
+
249
+ class PyremoteBootstrapDriver:
250
+ def __init__(self, main_src: str) -> None:
251
+ super().__init__()
252
+
253
+ self._main_src = main_src
254
+ self._main_z = zlib.compress(main_src.encode('utf-8'))
255
+
256
+ #
257
+
258
+ @dc.dataclass(frozen=True)
259
+ class Read:
260
+ sz: int
261
+
262
+ @dc.dataclass(frozen=True)
263
+ class Write:
264
+ d: bytes
265
+
266
+ class ProtocolError(Exception):
267
+ pass
268
+
269
+ @dc.dataclass(frozen=True)
270
+ class Result:
271
+ pid: int
272
+ env_info: PyremoteEnvInfo
273
+
274
+ def gen(self) -> ta.Generator[ta.Union[Read, Write], ta.Optional[bytes], Result]:
275
+ # Read first ack
276
+ yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK0)
277
+
278
+ # Read pid
279
+ d = yield from self._read(8)
280
+ pid = struct.unpack('<Q', d)[0]
281
+
282
+ # Write main src
283
+ yield from self._write(struct.pack('<I', len(self._main_z)))
284
+ yield from self._write(self._main_z)
285
+
286
+ # Read second and third ack
287
+ yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK1)
288
+ yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK2)
289
+
290
+ # Read env info
291
+ d = yield from self._read(4)
292
+ env_info_json_len = struct.unpack('<I', d)[0]
293
+ d = yield from self._read(env_info_json_len)
294
+ env_info_json = d.decode('utf-8')
295
+ env_info = PyremoteEnvInfo(**json.loads(env_info_json))
296
+
297
+ # Read fourth ack
298
+ yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK3)
299
+
300
+ # Return
301
+ return self.Result(
302
+ pid=pid,
303
+ env_info=env_info,
304
+ )
305
+
306
+ def _read(self, sz: int) -> ta.Generator[Read, bytes, bytes]:
307
+ d = yield self.Read(sz)
308
+ if not isinstance(d, bytes):
309
+ raise self.ProtocolError(f'Expected bytes after read, got {d!r}')
310
+ if len(d) != sz:
311
+ raise self.ProtocolError(f'Read {len(d)} bytes, expected {sz}')
312
+ return d
313
+
314
+ def _expect(self, e: bytes) -> ta.Generator[Read, bytes, None]:
315
+ d = yield from self._read(len(e))
316
+ if d != e:
317
+ raise self.ProtocolError(f'Read {d!r}, expected {e!r}')
318
+
319
+ def _write(self, d: bytes) -> ta.Generator[Write, ta.Optional[bytes], None]:
320
+ i = yield self.Write(d)
321
+ if i is not None:
322
+ raise self.ProtocolError('Unexpected input after write')
323
+
324
+ #
325
+
326
+ def run(self, stdin: ta.IO, stdout: ta.IO) -> Result:
327
+ gen = self.gen()
328
+
329
+ gi: bytes | None = None
330
+ while True:
331
+ try:
332
+ if gi is not None:
333
+ go = gen.send(gi)
334
+ else:
335
+ go = next(gen)
336
+ except StopIteration as e:
337
+ return e.value
338
+
339
+ if isinstance(go, self.Read):
340
+ gi = stdout.read(go.sz)
341
+ elif isinstance(go, self.Write):
342
+ gi = None
343
+ stdin.write(go.d)
344
+ stdin.flush()
345
+ else:
346
+ raise TypeError(go)
347
+
348
+
349
+ ##
350
+
351
+
352
+ @dc.dataclass(frozen=True)
353
+ class PyremotePayloadRuntime:
354
+ input: ta.BinaryIO
355
+ main_src: str
356
+ env_info: PyremoteEnvInfo
357
+
358
+
359
+ def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
360
+ # Restore original argv0
361
+ sys.executable = os.environ.pop(_PYREMOTE_BOOTSTRAP_ARGV0_VAR)
362
+
363
+ # Read second copy of main src
364
+ r1 = os.fdopen(_PYREMOTE_BOOTSTRAP_SRC_FD, 'rb', 0)
365
+ main_src = r1.read().decode('utf-8')
366
+ r1.close()
367
+
368
+ # Reap boostrap child. Must be done after reading second copy of source because source may be too big to fit in a
369
+ # pipe at once.
370
+ os.waitpid(int(os.environ.pop(_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR)), 0)
371
+
372
+ # Write third ack
373
+ os.write(1, _PYREMOTE_BOOTSTRAP_ACK2)
374
+
375
+ # Write env info
376
+ env_info = _get_pyremote_env_info()
377
+ env_info_json = json.dumps(dc.asdict(env_info), indent=None, separators=(',', ':')) # noqa
378
+ os.write(1, struct.pack('<I', len(env_info_json)))
379
+ os.write(1, env_info_json.encode('utf-8'))
380
+
381
+ # Write fourth ack
382
+ os.write(1, _PYREMOTE_BOOTSTRAP_ACK3)
383
+
384
+ # Return
385
+ return PyremotePayloadRuntime(
386
+ input=os.fdopen(_PYREMOTE_BOOTSTRAP_COMM_FD, 'rb', 0),
387
+ main_src=main_src,
388
+ env_info=env_info,
389
+ )
@@ -3,7 +3,7 @@
3
3
  # @omlish-lite
4
4
  # @omlish-script
5
5
  # @omlish-amalg-output ../supervisor/main.py
6
- # ruff: noqa: N802 U006 UP006 UP007 UP012 UP036
6
+ # ruff: noqa: N802 UP006 UP007 UP012 UP036
7
7
  # Supervisor is licensed under the following license:
8
8
  #
9
9
  # A copyright notice accompanies this license document that identifies the copyright holders.
@@ -1,4 +1,4 @@
1
- # ruff: noqa: U006 UP007
1
+ # ruff: noqa: UP006 UP007
2
2
  import contextlib
3
3
  import json
4
4
  import socket
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ominfra
3
- Version: 0.0.0.dev132
3
+ Version: 0.0.0.dev134
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.dev132
16
- Requires-Dist: omlish==0.0.0.dev132
15
+ Requires-Dist: omdev==0.0.0.dev134
16
+ Requires-Dist: omlish==0.0.0.dev134
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko~=3.5; extra == "all"
19
19
  Requires-Dist: asyncssh~=2.18; extra == "all"
@@ -3,6 +3,7 @@ ominfra/__about__.py,sha256=6i1AoruFYQCd-PyhhbDQDWY2d1tiQu9nkwWr-fXAqfY,705
3
3
  ominfra/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  ominfra/cmds.py,sha256=E0AfnvEmnKntXWvmLW5L05_NeDpBET1VBXn7vV6EwBQ,2083
5
5
  ominfra/configs.py,sha256=8aU1Qmbr-qjaE2iP3gAbA2SWJYMPZ-uGK007L01PoOI,1727
6
+ ominfra/pyremote.py,sha256=nqzmMKZvUMiw2y65v8VVjx832sKfSB7jBOkP8SQBmGI,10121
6
7
  ominfra/ssh.py,sha256=jQpc4WvkMckIfk4vILda8zFaeharRqc_6wxW50b0OjQ,5431
7
8
  ominfra/threadworkers.py,sha256=oX4ubZn7h932saXpRIJu2MNhBExgGGMuGhdXarZxLJw,4948
8
9
  ominfra/clouds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -21,33 +22,6 @@ ominfra/clouds/aws/journald2aws/main.py,sha256=RQJhk4aPtnp4EHzC-ST1Rs9BN6D7bqQQV
21
22
  ominfra/clouds/aws/journald2aws/poster.py,sha256=hz1XuctW8GtLmfjhRvCFY6py52D4BzXHYny5XKFpHSA,2833
22
23
  ominfra/clouds/gcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
24
  ominfra/clouds/gcp/auth.py,sha256=3PyfRJNgajjMqJFem3SKui0CqGeHEsZlvbRhuxFcZG8,1348
24
- ominfra/deploy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- ominfra/deploy/_executor.py,sha256=4i5JP4tiF-MJQHxwstja4tRoYprnAMyzGd9f_az3r98,35355
26
- ominfra/deploy/configs.py,sha256=qi0kwT7G2NH7dXLOQic-u6R3yeadup_QtvrjwWIggbM,435
27
- ominfra/deploy/remote.py,sha256=6ACmpXU1uBdyGs3Xsp97ktKFq30cJlzN9LRWNUWlGY4,2144
28
- ominfra/deploy/executor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
29
- ominfra/deploy/executor/base.py,sha256=AjpUT1iPsJHrDNzcflZ9IazpClmWZaGjYxE0NIBazoQ,2815
30
- ominfra/deploy/executor/main.py,sha256=U5p-78koTjYP_JzcE8DfwXEtGNS6nJMn3LiBiofF8a0,2641
31
- ominfra/deploy/executor/concerns/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- ominfra/deploy/executor/concerns/dirs.py,sha256=Iqhva6v8nIPhMkhJFsr5lUsbTMgu-cWYv7nDwHrMSmY,696
33
- ominfra/deploy/executor/concerns/nginx.py,sha256=mIL25l6PCPleUbHK2_9cS5FU19ODcT6gVLrUqN43gf8,1541
34
- ominfra/deploy/executor/concerns/repo.py,sha256=mlTqxjWKGPTE8McJ41tUqwdCaFeMxqxczbMH-8LDR0Y,500
35
- ominfra/deploy/executor/concerns/supervisor.py,sha256=KuMutAOwQjcOrng3ROYjwUErWPg7_Urf0Bvde20xi2s,1796
36
- ominfra/deploy/executor/concerns/systemd.py,sha256=MtsSEToEa1HNouern_JukcYTnypw_i00VyKs9lJkXu4,2861
37
- ominfra/deploy/executor/concerns/user.py,sha256=j5LDfQXquIp-eEM7t6aShsrYoQrM_ILXZycTmTcRVxA,686
38
- ominfra/deploy/executor/concerns/venv.py,sha256=jbRriqJHO4r9Zyo5Hfl_qVmcU6Qm6UgrouBroKcPn2g,775
39
- ominfra/deploy/poly/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
40
- ominfra/deploy/poly/_main.py,sha256=fqlcDbbfY6gmebcO9BMWD9sz6V6_gxFTQr194xi69N4,24174
41
- ominfra/deploy/poly/base.py,sha256=1dGuzWxi2Z6Hm6-YlkVxPk9r3In2aCJ0p8lGR-QQI_s,4166
42
- ominfra/deploy/poly/configs.py,sha256=9bzWdbxhOk_Q4KokDjmRz254KHnUU71Vl1frLlhQyU4,584
43
- ominfra/deploy/poly/deploy.py,sha256=tMYKslXLjstcv86siRt5j37USsS0Wd6lsfeGRE26zio,544
44
- ominfra/deploy/poly/main.py,sha256=nHTE6oRfdQzoMAK6VNypVumFU6R8C-nAIlnCJKaqxU8,472
45
- ominfra/deploy/poly/nginx.py,sha256=9PZu-7oOiyrjBzL4SyczyJwoq4a1lBhSfyFLhE9BgkE,1842
46
- ominfra/deploy/poly/repo.py,sha256=nqhIhOreAQ4JcOgIQmCwjZ7EWnIMj7B9N7b8uko24sc,1205
47
- ominfra/deploy/poly/runtime.py,sha256=G66AI-a27Wi6QYpG3M0ryqI7c5MnJkXt-_j9Qi8UiUk,1066
48
- ominfra/deploy/poly/site.py,sha256=QJwDDJoVm2-kxi4bxIrp-mn4y2qDLuW3CAUax3W8gv8,239
49
- ominfra/deploy/poly/supervisor.py,sha256=zkl6VQBcAZaMAhyR9DbbbqULcgFCDZoe9S_vP-mMFQ8,2289
50
- ominfra/deploy/poly/venv.py,sha256=BoipDEa4NTeodjf3L57KJfq9eGKLagFNKwD8pS4yrzA,1552
51
25
  ominfra/journald/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
26
  ominfra/journald/fields.py,sha256=NjjVn7GW4jkcGdyiiizVjEfQqSFnolXYk3kDcSQcMmc,12278
53
27
  ominfra/journald/genmessages.py,sha256=rLTS-K2v7otNOtTz4RoOEVYCm0fQuuBzf47e0T61tA8,1857
@@ -55,13 +29,36 @@ ominfra/journald/messages.py,sha256=Wr7TjWMOySc0WnKwp_-idR8RfeKlbyJQ_KkELr0VB70,
55
29
  ominfra/journald/tailer.py,sha256=5abcFMfgi7fnY9ZEQe2ZVobaJxjQkeu6d9Kagw33a1w,33525
56
30
  ominfra/manage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
31
  ominfra/manage/manage.py,sha256=BttL8LFEknHZE_h2Pt5dAqbfUkv6qy43WI0raXBZ1a8,151
58
- ominfra/pyremote/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
- ominfra/pyremote/_runcommands.py,sha256=RKNvaHje-QGpvwwmFQ6OfEn3eEJ2c6zVUBYnDo2RV9U,29188
60
- ominfra/pyremote/bootstrap.py,sha256=RvMO3YGaN1E4sgUi1JEtiPak8cjvqtc_vRCq1yqbeZg,3370
61
- ominfra/pyremote/runcommands.py,sha256=bviS0_TDIoZVAe4h-_iavbvJtVSFu8lnk7fQ5iasCWE,1571
32
+ ominfra/manage/deploy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ ominfra/manage/deploy/_executor.py,sha256=lk1pXkwqijudeQ9Ti8oxP4O-qUFDFzcXI8H-Ox5K-SA,35385
34
+ ominfra/manage/deploy/configs.py,sha256=qi0kwT7G2NH7dXLOQic-u6R3yeadup_QtvrjwWIggbM,435
35
+ ominfra/manage/deploy/remote.py,sha256=WHHElLmYk6wEDC4R8s_jHi1z71CCuV3soqF3elzIWEM,2145
36
+ ominfra/manage/deploy/executor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
37
+ ominfra/manage/deploy/executor/base.py,sha256=AjpUT1iPsJHrDNzcflZ9IazpClmWZaGjYxE0NIBazoQ,2815
38
+ ominfra/manage/deploy/executor/main.py,sha256=U5p-78koTjYP_JzcE8DfwXEtGNS6nJMn3LiBiofF8a0,2641
39
+ ominfra/manage/deploy/executor/concerns/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ ominfra/manage/deploy/executor/concerns/dirs.py,sha256=Iqhva6v8nIPhMkhJFsr5lUsbTMgu-cWYv7nDwHrMSmY,696
41
+ ominfra/manage/deploy/executor/concerns/nginx.py,sha256=mIL25l6PCPleUbHK2_9cS5FU19ODcT6gVLrUqN43gf8,1541
42
+ ominfra/manage/deploy/executor/concerns/repo.py,sha256=mlTqxjWKGPTE8McJ41tUqwdCaFeMxqxczbMH-8LDR0Y,500
43
+ ominfra/manage/deploy/executor/concerns/supervisor.py,sha256=KuMutAOwQjcOrng3ROYjwUErWPg7_Urf0Bvde20xi2s,1796
44
+ ominfra/manage/deploy/executor/concerns/systemd.py,sha256=MtsSEToEa1HNouern_JukcYTnypw_i00VyKs9lJkXu4,2861
45
+ ominfra/manage/deploy/executor/concerns/user.py,sha256=j5LDfQXquIp-eEM7t6aShsrYoQrM_ILXZycTmTcRVxA,686
46
+ ominfra/manage/deploy/executor/concerns/venv.py,sha256=jbRriqJHO4r9Zyo5Hfl_qVmcU6Qm6UgrouBroKcPn2g,775
47
+ ominfra/manage/deploy/poly/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
48
+ ominfra/manage/deploy/poly/_main.py,sha256=Qc66G51CqQUt03rqT2u96p7H73UJnvxm7IhAAWNbMsE,24192
49
+ ominfra/manage/deploy/poly/base.py,sha256=1dGuzWxi2Z6Hm6-YlkVxPk9r3In2aCJ0p8lGR-QQI_s,4166
50
+ ominfra/manage/deploy/poly/configs.py,sha256=9bzWdbxhOk_Q4KokDjmRz254KHnUU71Vl1frLlhQyU4,584
51
+ ominfra/manage/deploy/poly/deploy.py,sha256=tMYKslXLjstcv86siRt5j37USsS0Wd6lsfeGRE26zio,544
52
+ ominfra/manage/deploy/poly/main.py,sha256=nHTE6oRfdQzoMAK6VNypVumFU6R8C-nAIlnCJKaqxU8,472
53
+ ominfra/manage/deploy/poly/nginx.py,sha256=9PZu-7oOiyrjBzL4SyczyJwoq4a1lBhSfyFLhE9BgkE,1842
54
+ ominfra/manage/deploy/poly/repo.py,sha256=nqhIhOreAQ4JcOgIQmCwjZ7EWnIMj7B9N7b8uko24sc,1205
55
+ ominfra/manage/deploy/poly/runtime.py,sha256=G66AI-a27Wi6QYpG3M0ryqI7c5MnJkXt-_j9Qi8UiUk,1066
56
+ ominfra/manage/deploy/poly/site.py,sha256=QJwDDJoVm2-kxi4bxIrp-mn4y2qDLuW3CAUax3W8gv8,239
57
+ ominfra/manage/deploy/poly/supervisor.py,sha256=zkl6VQBcAZaMAhyR9DbbbqULcgFCDZoe9S_vP-mMFQ8,2289
58
+ ominfra/manage/deploy/poly/venv.py,sha256=BoipDEa4NTeodjf3L57KJfq9eGKLagFNKwD8pS4yrzA,1552
62
59
  ominfra/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
60
  ominfra/scripts/journald2aws.py,sha256=o6WgI9R3MXdH4-BKUYAK2pcu3E5T0GAl5pggzR4Lhrk,131537
64
- ominfra/scripts/supervisor.py,sha256=_n84Wz_L1QZmOTD3S9PGecmSt6OUPCO6K9lOu4VoByE,245533
61
+ ominfra/scripts/supervisor.py,sha256=gy2P8K8aATDQDvSFqgnvIun2qlZrWg2F066kzcoQRdc,245528
65
62
  ominfra/supervisor/LICENSE.txt,sha256=yvqaMNsDhWxziHa9ien6qCW1SkZv-DQlAg96XjfSee8,1746
66
63
  ominfra/supervisor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
67
64
  ominfra/supervisor/__main__.py,sha256=I0yFw-C08OOiZ3BF6lF1Oiv789EQXu-_j6whDhQUTEA,66
@@ -72,7 +69,7 @@ ominfra/supervisor/events.py,sha256=XGrtzHr1xm0dwjz329fn9eR0_Ap-LQL6Sk8LJ8eVDEo,
72
69
  ominfra/supervisor/exceptions.py,sha256=Qbu211H3CLlSmi9LsSikOwrcL5HgJP9ugvcKWlGTAoI,750
73
70
  ominfra/supervisor/groups.py,sha256=MBbsbt8Zh_WEYkGOr1KXa82gnPVw9wPB2lAnqhugXSc,2457
74
71
  ominfra/supervisor/groupsimpl.py,sha256=nIrW4SmB0W6c2jOR_HhkfVcH4eHyLZnG1FJ0MCzc6mQ,2292
75
- ominfra/supervisor/http.py,sha256=WC7TD6ECD28GU83sUAd6Xau2pvYyZZmmFDgL-E4_Jd0,3472
72
+ ominfra/supervisor/http.py,sha256=VqE3Q-5nJavMEZJ_MrDsmZmlmJ2mu_rlnyj9gN4hRVI,3473
76
73
  ominfra/supervisor/inject.py,sha256=cH7ZV5KnOlHh90_S6YWlJsJCfM9Ve956GzEAhl4arx8,4627
77
74
  ominfra/supervisor/io.py,sha256=_G66luJDF-i1JPM-qJiREMdmHk2ul7n-kjr7ex1sF6s,3200
78
75
  ominfra/supervisor/main.py,sha256=oqaWOcnHJgaxNhjyphPgjaNjHPjDcx7kzYMjtZpwSxE,4253
@@ -103,9 +100,9 @@ ominfra/tailscale/api.py,sha256=C5-t_b6jZXUWcy5k8bXm7CFnk73pSdrlMOgGDeGVrpw,1370
103
100
  ominfra/tailscale/cli.py,sha256=DSGp4hn5xwOW-l_u_InKlSF6kIobxtUtVssf_73STs0,3567
104
101
  ominfra/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
102
  ominfra/tools/listresources.py,sha256=4qVg5txsb10EHhvqXXeM6gJ2jx9LbroEnPydDv1uXs0,6176
106
- ominfra-0.0.0.dev132.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
107
- ominfra-0.0.0.dev132.dist-info/METADATA,sha256=vq41f4P1jKGnX9UuGdMibA-bayJhVbb8rk_vZQw0-r8,731
108
- ominfra-0.0.0.dev132.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
109
- ominfra-0.0.0.dev132.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
110
- ominfra-0.0.0.dev132.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
111
- ominfra-0.0.0.dev132.dist-info/RECORD,,
103
+ ominfra-0.0.0.dev134.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
104
+ ominfra-0.0.0.dev134.dist-info/METADATA,sha256=pJ8EYFED29tv1T8wzhlFFm2rKeNXXS2c4Iw8hjFEvSA,731
105
+ ominfra-0.0.0.dev134.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
106
+ ominfra-0.0.0.dev134.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
107
+ ominfra-0.0.0.dev134.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
108
+ ominfra-0.0.0.dev134.dist-info/RECORD,,
File without changes