ominfra 0.0.0.dev132__py3-none-any.whl → 0.0.0.dev133__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
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 +357 -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.dev133.dist-info}/METADATA +3 -3
  8. {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev133.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.dev133.dist-info}/LICENSE +0 -0
  38. {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev133.dist-info}/WHEEL +0 -0
  39. {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev133.dist-info}/entry_points.txt +0 -0
  40. {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev133.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,357 @@
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
+ from omlish.lite.check import check_isinstance
21
+ from omlish.lite.check import check_none
22
+
23
+
24
+ ##
25
+
26
+
27
+ _PYREMOTE_BOOTSTRAP_COMM_FD = 100
28
+ _PYREMOTE_BOOTSTRAP_SRC_FD = 101
29
+
30
+ _PYREMOTE_BOOTSTRAP_CHILD_PID_VAR = '_OPYR_CPID'
31
+ _PYREMOTE_BOOTSTRAP_ARGV0_VAR = '_OPYR_ARGV0'
32
+
33
+ _PYREMOTE_BOOTSTRAP_ACK0 = b'OPYR000\n'
34
+ _PYREMOTE_BOOTSTRAP_ACK1 = b'OPYR001\n'
35
+ _PYREMOTE_BOOTSTRAP_ACK2 = b'OPYR001\n'
36
+ _PYREMOTE_BOOTSTRAP_ACK3 = b'OPYR001\n'
37
+
38
+ _PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT = '(pyremote:%s)'
39
+
40
+ _PYREMOTE_BOOTSTRAP_IMPORTS = [
41
+ 'base64',
42
+ 'os',
43
+ 'struct',
44
+ 'sys',
45
+ 'zlib',
46
+ ]
47
+
48
+
49
+ def _pyremote_bootstrap_main(context_name: str) -> None:
50
+ # Get pid
51
+ pid = os.getpid()
52
+
53
+ # Two copies of main src to be sent to parent
54
+ r0, w0 = os.pipe()
55
+ r1, w1 = os.pipe()
56
+
57
+ if (cp := os.fork()):
58
+ # Parent process
59
+
60
+ # Dup original stdin to comm_fd for use as comm channel
61
+ os.dup2(0, _PYREMOTE_BOOTSTRAP_COMM_FD)
62
+
63
+ # Overwrite stdin (fed to python repl) with first copy of src
64
+ os.dup2(r0, 0)
65
+
66
+ # Dup second copy of src to src_fd to recover after launch
67
+ os.dup2(r1, _PYREMOTE_BOOTSTRAP_SRC_FD)
68
+
69
+ # Close remaining fd's
70
+ for f in [r0, w0, r1, w1]:
71
+ os.close(f)
72
+
73
+ # Save child pid to close after relaunch
74
+ os.environ[_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR] = str(cp)
75
+
76
+ # Save original argv0
77
+ os.environ[_PYREMOTE_BOOTSTRAP_ARGV0_VAR] = sys.executable
78
+
79
+ # Start repl reading stdin from r0
80
+ os.execl(sys.executable, sys.executable + (_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT % (context_name,)))
81
+
82
+ else:
83
+ # Child process
84
+
85
+ # Write first ack
86
+ os.write(1, _PYREMOTE_BOOTSTRAP_ACK0)
87
+
88
+ # Write pid
89
+ os.write(1, struct.pack('<Q', pid))
90
+
91
+ # Read main src from stdin
92
+ main_z_len = struct.unpack('<I', os.read(0, 4))[0]
93
+ main_src = zlib.decompress(os.fdopen(0, 'rb').read(main_z_len))
94
+
95
+ # Write both copies of main src. Must write to w0 (parent stdin) before w1 (copy pipe) as pipe will likely fill
96
+ # and block and need to be drained by pyremote_bootstrap_finalize running in parent.
97
+ for w in [w0, w1]:
98
+ fp = os.fdopen(w, 'wb', 0)
99
+ fp.write(main_src)
100
+ fp.close()
101
+
102
+ # Write second ack
103
+ os.write(1, _PYREMOTE_BOOTSTRAP_ACK1)
104
+
105
+ # Exit child
106
+ sys.exit(0)
107
+
108
+
109
+ ##
110
+
111
+
112
+ def pyremote_build_bootstrap_cmd(context_name: str) -> str:
113
+ bs_src = textwrap.dedent(inspect.getsource(_pyremote_bootstrap_main))
114
+
115
+ for gl in [
116
+ '_PYREMOTE_BOOTSTRAP_COMM_FD',
117
+ '_PYREMOTE_BOOTSTRAP_SRC_FD',
118
+
119
+ '_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR',
120
+ '_PYREMOTE_BOOTSTRAP_ARGV0_VAR',
121
+
122
+ '_PYREMOTE_BOOTSTRAP_ACK0',
123
+ '_PYREMOTE_BOOTSTRAP_ACK1',
124
+
125
+ '_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT',
126
+ ]:
127
+ bs_src = bs_src.replace(gl, repr(globals()[gl]))
128
+
129
+ bs_src = '\n'.join(
130
+ cl
131
+ for l in bs_src.splitlines()
132
+ if (cl := (l.split('#')[0]).rstrip())
133
+ if cl.strip()
134
+ )
135
+
136
+ bs_z = zlib.compress(bs_src.encode('utf-8'))
137
+ bs_z64 = base64.encodebytes(bs_z).replace(b'\n', b'')
138
+
139
+ stmts = [
140
+ f'import {", ".join(_PYREMOTE_BOOTSTRAP_IMPORTS)}',
141
+ f'exec(zlib.decompress(base64.decodebytes({bs_z64!r})))',
142
+ f'_pyremote_bootstrap_main({context_name!r})',
143
+ ]
144
+
145
+ cmd = '; '.join(stmts)
146
+ return cmd
147
+
148
+
149
+ ##
150
+
151
+
152
+ @dc.dataclass(frozen=True)
153
+ class PyremoteEnvInfo:
154
+ sys_base_prefix: str
155
+ sys_byteorder: str
156
+ sys_defaultencoding: str
157
+ sys_exec_prefix: str
158
+ sys_executable: str
159
+ sys_implementation_name: str
160
+ sys_path: ta.List[str]
161
+ sys_platform: str
162
+ sys_prefix: str
163
+ sys_version: str
164
+ sys_version_info: ta.List[ta.Union[int, str]]
165
+
166
+ platform_architecture: ta.List[str]
167
+ platform_machine: str
168
+ platform_platform: str
169
+ platform_processor: str
170
+ platform_system: str
171
+ platform_release: str
172
+ platform_version: str
173
+
174
+ site_userbase: str
175
+
176
+ os_cwd: str
177
+ os_gid: int
178
+ os_loadavg: ta.List[float]
179
+ os_login: ta.Optional[str]
180
+ os_pgrp: int
181
+ os_pid: int
182
+ os_ppid: int
183
+ os_uid: int
184
+
185
+ pw_name: str
186
+ pw_uid: int
187
+ pw_gid: int
188
+ pw_gecos: str
189
+ pw_dir: str
190
+ pw_shell: str
191
+
192
+ env_path: ta.Optional[str]
193
+
194
+
195
+ def _get_pyremote_env_info() -> PyremoteEnvInfo:
196
+ os_uid = os.getuid()
197
+
198
+ pw = pwd.getpwuid(os_uid)
199
+
200
+ os_login: ta.Optional[str]
201
+ try:
202
+ os_login = os.getlogin()
203
+ except OSError:
204
+ os_login = None
205
+
206
+ return PyremoteEnvInfo(
207
+ sys_base_prefix=sys.base_prefix,
208
+ sys_byteorder=sys.byteorder,
209
+ sys_defaultencoding=sys.getdefaultencoding(),
210
+ sys_exec_prefix=sys.exec_prefix,
211
+ sys_executable=sys.executable,
212
+ sys_implementation_name=sys.implementation.name,
213
+ sys_path=sys.path,
214
+ sys_platform=sys.platform,
215
+ sys_prefix=sys.prefix,
216
+ sys_version=sys.version,
217
+ sys_version_info=list(sys.version_info),
218
+
219
+ platform_architecture=list(platform.architecture()),
220
+ platform_machine=platform.machine(),
221
+ platform_platform=platform.platform(),
222
+ platform_processor=platform.processor(),
223
+ platform_system=platform.system(),
224
+ platform_release=platform.release(),
225
+ platform_version=platform.version(),
226
+
227
+ site_userbase=site.getuserbase(),
228
+
229
+ os_cwd=os.getcwd(),
230
+ os_gid=os.getgid(),
231
+ os_loadavg=list(os.getloadavg()),
232
+ os_login=os_login,
233
+ os_pgrp=os.getpgrp(),
234
+ os_pid=os.getpid(),
235
+ os_ppid=os.getppid(),
236
+ os_uid=os_uid,
237
+
238
+ pw_name=pw.pw_name,
239
+ pw_uid=pw.pw_uid,
240
+ pw_gid=pw.pw_gid,
241
+ pw_gecos=pw.pw_gecos,
242
+ pw_dir=pw.pw_dir,
243
+ pw_shell=pw.pw_shell,
244
+
245
+ env_path=os.environ.get('PATH'),
246
+ )
247
+
248
+
249
+ ##
250
+
251
+
252
+ class PyremoteBootstrapDriver:
253
+ def __init__(self, main_src: str) -> None:
254
+ super().__init__()
255
+
256
+ self._main_src = main_src
257
+ self._main_z = zlib.compress(main_src.encode('utf-8'))
258
+
259
+ @dc.dataclass(frozen=True)
260
+ class Read:
261
+ sz: int
262
+
263
+ @dc.dataclass(frozen=True)
264
+ class Write:
265
+ d: bytes
266
+
267
+ class ProtocolError(Exception):
268
+ pass
269
+
270
+ @dc.dataclass(frozen=True)
271
+ class Result:
272
+ pid: int
273
+ env_info: PyremoteEnvInfo
274
+
275
+ def __call__(self) -> ta.Generator[ta.Union[Read, Write], ta.Optional[bytes], Result]:
276
+ # Read first ack
277
+ yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK0)
278
+
279
+ # Read pid
280
+ d = yield from self._read(8)
281
+ pid = struct.unpack('<Q', d)[0]
282
+
283
+ # Write main src
284
+ check_none((yield self.Write(struct.pack('<I', len(self._main_z)))))
285
+ check_none((yield self.Write(self._main_z)))
286
+
287
+ # Read second and third ack
288
+ yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK1)
289
+ yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK2)
290
+
291
+ # Read env info
292
+ d = yield from self._read(4)
293
+ env_info_json_len = struct.unpack('<I', d)[0]
294
+ d = yield from self._read(env_info_json_len)
295
+ env_info_json = d.decode('utf-8')
296
+ env_info = PyremoteEnvInfo(**json.loads(env_info_json))
297
+
298
+ # Read fourth ack
299
+ yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK3)
300
+
301
+ # Return
302
+ return self.Result(
303
+ pid=pid,
304
+ env_info=env_info,
305
+ )
306
+
307
+ def _read(self, sz: int) -> ta.Generator[Read, bytes, bytes]:
308
+ d = check_isinstance((yield self.Read(sz)), bytes)
309
+ if len(d) != sz:
310
+ raise self.ProtocolError(f'Read {len(d)} bytes, expected {sz}')
311
+ return d
312
+
313
+ def _expect(self, e: bytes) -> ta.Generator[Read, bytes, None]:
314
+ d = yield from self._read(len(e))
315
+ if d != e:
316
+ raise self.ProtocolError(f'Read {d!r}, expected {e!r}')
317
+
318
+
319
+ ##
320
+
321
+
322
+ @dc.dataclass(frozen=True)
323
+ class PyremoteBootstrapPayloadRuntime:
324
+ input: ta.BinaryIO
325
+ main_src: str
326
+
327
+
328
+ def pyremote_bootstrap_finalize() -> PyremoteBootstrapPayloadRuntime:
329
+ # Restore original argv0
330
+ sys.executable = os.environ.pop(_PYREMOTE_BOOTSTRAP_ARGV0_VAR)
331
+
332
+ # Read second copy of main src
333
+ r1 = os.fdopen(_PYREMOTE_BOOTSTRAP_SRC_FD, 'rb', 0)
334
+ main_src = r1.read().decode('utf-8')
335
+ r1.close()
336
+
337
+ # Reap boostrap child. Must be done after reading second copy of source because source may be too big to fit in a
338
+ # pipe at once.
339
+ os.waitpid(int(os.environ.pop(_PYREMOTE_BOOTSTRAP_CHILD_PID_VAR)), 0)
340
+
341
+ # Write third ack
342
+ os.write(1, _PYREMOTE_BOOTSTRAP_ACK2)
343
+
344
+ # Write env info
345
+ env_info = _get_pyremote_env_info()
346
+ env_info_json = json.dumps(dc.asdict(env_info), indent=None, separators=(',', ':')) # noqa
347
+ os.write(1, struct.pack('<I', len(env_info_json)))
348
+ os.write(1, env_info_json.encode('utf-8'))
349
+
350
+ # Write fourth ack
351
+ os.write(1, _PYREMOTE_BOOTSTRAP_ACK3)
352
+
353
+ # Return
354
+ return PyremoteBootstrapPayloadRuntime(
355
+ input=os.fdopen(_PYREMOTE_BOOTSTRAP_COMM_FD, 'rb', 0),
356
+ main_src=main_src,
357
+ )
@@ -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.dev133
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.dev133
16
+ Requires-Dist: omlish==0.0.0.dev133
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=U7OYc4iF1HGRcESdq_KhoS1RqTWHk4bq8yFRORFX4O0,9264
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.dev133.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
104
+ ominfra-0.0.0.dev133.dist-info/METADATA,sha256=_KW6-EvKpnZ8VyQPHOE1ueDkQ8zjfd2CJ-VAl_WsIbY,731
105
+ ominfra-0.0.0.dev133.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
106
+ ominfra-0.0.0.dev133.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
107
+ ominfra-0.0.0.dev133.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
108
+ ominfra-0.0.0.dev133.dist-info/RECORD,,
File without changes