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.
- ominfra/{deploy → manage/deploy}/_executor.py +10 -10
- ominfra/{deploy → manage/deploy}/poly/_main.py +6 -6
- ominfra/{deploy → manage/deploy}/remote.py +1 -1
- ominfra/pyremote.py +389 -0
- ominfra/scripts/supervisor.py +1 -1
- ominfra/supervisor/http.py +1 -1
- {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev134.dist-info}/METADATA +3 -3
- {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev134.dist-info}/RECORD +36 -39
- ominfra/pyremote/__init__.py +0 -0
- ominfra/pyremote/_runcommands.py +0 -1201
- ominfra/pyremote/bootstrap.py +0 -149
- ominfra/pyremote/runcommands.py +0 -56
- /ominfra/{deploy → manage/deploy}/__init__.py +0 -0
- /ominfra/{deploy → manage/deploy}/configs.py +0 -0
- /ominfra/{deploy → manage/deploy}/executor/__init__.py +0 -0
- /ominfra/{deploy → manage/deploy}/executor/base.py +0 -0
- /ominfra/{deploy → manage/deploy}/executor/concerns/__init__.py +0 -0
- /ominfra/{deploy → manage/deploy}/executor/concerns/dirs.py +0 -0
- /ominfra/{deploy → manage/deploy}/executor/concerns/nginx.py +0 -0
- /ominfra/{deploy → manage/deploy}/executor/concerns/repo.py +0 -0
- /ominfra/{deploy → manage/deploy}/executor/concerns/supervisor.py +0 -0
- /ominfra/{deploy → manage/deploy}/executor/concerns/systemd.py +0 -0
- /ominfra/{deploy → manage/deploy}/executor/concerns/user.py +0 -0
- /ominfra/{deploy → manage/deploy}/executor/concerns/venv.py +0 -0
- /ominfra/{deploy → manage/deploy}/executor/main.py +0 -0
- /ominfra/{deploy → manage/deploy}/poly/__init__.py +0 -0
- /ominfra/{deploy → manage/deploy}/poly/base.py +0 -0
- /ominfra/{deploy → manage/deploy}/poly/configs.py +0 -0
- /ominfra/{deploy → manage/deploy}/poly/deploy.py +0 -0
- /ominfra/{deploy → manage/deploy}/poly/main.py +0 -0
- /ominfra/{deploy → manage/deploy}/poly/nginx.py +0 -0
- /ominfra/{deploy → manage/deploy}/poly/repo.py +0 -0
- /ominfra/{deploy → manage/deploy}/poly/runtime.py +0 -0
- /ominfra/{deploy → manage/deploy}/poly/site.py +0 -0
- /ominfra/{deploy → manage/deploy}/poly/supervisor.py +0 -0
- /ominfra/{deploy → manage/deploy}/poly/venv.py +0 -0
- {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev134.dist-info}/LICENSE +0 -0
- {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev134.dist-info}/WHEEL +0 -0
- {ominfra-0.0.0.dev132.dist-info → ominfra-0.0.0.dev134.dist-info}/entry_points.txt +0 -0
- {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
|
-
#
|
85
|
+
# ../../../../omlish/lite/cached.py
|
86
86
|
T = ta.TypeVar('T')
|
87
87
|
|
88
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
711
|
+
# ../../../../../omlish/lite/subprocesses.py
|
712
712
|
|
713
713
|
|
714
714
|
##
|
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
|
+
)
|
ominfra/scripts/supervisor.py
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# @omlish-lite
|
4
4
|
# @omlish-script
|
5
5
|
# @omlish-amalg-output ../supervisor/main.py
|
6
|
-
# ruff: noqa: N802
|
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.
|
ominfra/supervisor/http.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ominfra
|
3
|
-
Version: 0.0.0.
|
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.
|
16
|
-
Requires-Dist: omlish==0.0.0.
|
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/
|
59
|
-
ominfra/
|
60
|
-
ominfra/
|
61
|
-
ominfra/
|
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=
|
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=
|
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.
|
107
|
-
ominfra-0.0.0.
|
108
|
-
ominfra-0.0.0.
|
109
|
-
ominfra-0.0.0.
|
110
|
-
ominfra-0.0.0.
|
111
|
-
ominfra-0.0.0.
|
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,,
|
ominfra/pyremote/__init__.py
DELETED
File without changes
|