ominfra 0.0.0.dev133__py3-none-any.whl → 0.0.0.dev135__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/manage/deploy/_executor.py +9 -6
- ominfra/manage/new/__init__.py +1 -0
- ominfra/manage/new/_manage.py +1635 -0
- ominfra/manage/new/commands/__init__.py +0 -0
- ominfra/manage/new/commands/base.py +25 -0
- ominfra/manage/new/commands/subprocess.py +73 -0
- ominfra/manage/new/main.py +159 -0
- ominfra/pyremote.py +50 -12
- ominfra/scripts/journald2aws.py +9 -6
- ominfra/scripts/supervisor.py +13 -7
- {ominfra-0.0.0.dev133.dist-info → ominfra-0.0.0.dev135.dist-info}/METADATA +3 -3
- {ominfra-0.0.0.dev133.dist-info → ominfra-0.0.0.dev135.dist-info}/RECORD +16 -10
- {ominfra-0.0.0.dev133.dist-info → ominfra-0.0.0.dev135.dist-info}/LICENSE +0 -0
- {ominfra-0.0.0.dev133.dist-info → ominfra-0.0.0.dev135.dist-info}/WHEEL +0 -0
- {ominfra-0.0.0.dev133.dist-info → ominfra-0.0.0.dev135.dist-info}/entry_points.txt +0 -0
- {ominfra-0.0.0.dev133.dist-info → ominfra-0.0.0.dev135.dist-info}/top_level.txt +0 -0
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
import abc
|
3
|
+
import dataclasses as dc
|
4
|
+
import typing as ta
|
5
|
+
|
6
|
+
|
7
|
+
CommandInputT = ta.TypeVar('CommandInputT', bound='Command.Input')
|
8
|
+
CommandOutputT = ta.TypeVar('CommandOutputT', bound='Command.Output')
|
9
|
+
|
10
|
+
|
11
|
+
##
|
12
|
+
|
13
|
+
|
14
|
+
class Command(abc.ABC, ta.Generic[CommandInputT, CommandOutputT]):
|
15
|
+
@dc.dataclass(frozen=True)
|
16
|
+
class Input(abc.ABC): # noqa
|
17
|
+
pass
|
18
|
+
|
19
|
+
@dc.dataclass(frozen=True)
|
20
|
+
class Output(abc.ABC): # noqa
|
21
|
+
pass
|
22
|
+
|
23
|
+
@abc.abstractmethod
|
24
|
+
def _execute(self, inp: CommandInputT) -> CommandOutputT:
|
25
|
+
raise NotImplementedError
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
import dataclasses as dc
|
3
|
+
import os
|
4
|
+
import subprocess
|
5
|
+
import time
|
6
|
+
import typing as ta
|
7
|
+
|
8
|
+
from omlish.lite.subprocesses import subprocess_maybe_shell_wrap_exec
|
9
|
+
|
10
|
+
from .base import Command
|
11
|
+
|
12
|
+
|
13
|
+
##
|
14
|
+
|
15
|
+
|
16
|
+
class SubprocessCommand(Command['SubprocessCommand.Input', 'SubprocessCommand.Output']):
|
17
|
+
@dc.dataclass(frozen=True)
|
18
|
+
class Input(Command.Input):
|
19
|
+
args: ta.Sequence[str]
|
20
|
+
|
21
|
+
shell: bool = False
|
22
|
+
cwd: ta.Optional[str] = None
|
23
|
+
env: ta.Optional[ta.Mapping[str, str]] = None
|
24
|
+
|
25
|
+
capture_stdout: bool = False
|
26
|
+
capture_stderr: bool = False
|
27
|
+
|
28
|
+
input: ta.Optional[bytes] = None
|
29
|
+
timeout: ta.Optional[float] = None
|
30
|
+
|
31
|
+
def __post_init__(self) -> None:
|
32
|
+
if isinstance(self.args, str):
|
33
|
+
raise TypeError(self.args)
|
34
|
+
|
35
|
+
@dc.dataclass(frozen=True)
|
36
|
+
class Output(Command.Output):
|
37
|
+
rc: int
|
38
|
+
pid: int
|
39
|
+
|
40
|
+
elapsed_s: float
|
41
|
+
|
42
|
+
stdout: ta.Optional[bytes] = None
|
43
|
+
stderr: ta.Optional[bytes] = None
|
44
|
+
|
45
|
+
def _execute(self, inp: Input) -> Output:
|
46
|
+
proc = subprocess.Popen(
|
47
|
+
subprocess_maybe_shell_wrap_exec(*inp.args),
|
48
|
+
|
49
|
+
shell=inp.shell,
|
50
|
+
cwd=inp.cwd,
|
51
|
+
env={**os.environ, **(inp.env or {})},
|
52
|
+
|
53
|
+
stdin=subprocess.PIPE if inp.input is not None else None,
|
54
|
+
stdout=subprocess.PIPE if inp.capture_stdout else None,
|
55
|
+
stderr=subprocess.PIPE if inp.capture_stderr else None,
|
56
|
+
)
|
57
|
+
|
58
|
+
start_time = time.time()
|
59
|
+
stdout, stderr = proc.communicate(
|
60
|
+
input=inp.input,
|
61
|
+
timeout=inp.timeout,
|
62
|
+
)
|
63
|
+
end_time = time.time()
|
64
|
+
|
65
|
+
return SubprocessCommand.Output(
|
66
|
+
rc=proc.returncode,
|
67
|
+
pid=proc.pid,
|
68
|
+
|
69
|
+
elapsed_s=end_time - start_time,
|
70
|
+
|
71
|
+
stdout=stdout, # noqa
|
72
|
+
stderr=stderr, # noqa
|
73
|
+
)
|
@@ -0,0 +1,159 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# @omlish-amalg ./_manage.py
|
3
|
+
# ruff: noqa: UP006 UP007
|
4
|
+
import inspect
|
5
|
+
import json
|
6
|
+
import os
|
7
|
+
import shlex
|
8
|
+
import struct
|
9
|
+
import subprocess
|
10
|
+
import sys
|
11
|
+
import typing as ta
|
12
|
+
|
13
|
+
from omlish.lite.check import check_not_none
|
14
|
+
from omlish.lite.json import json_dumps_compact
|
15
|
+
from omlish.lite.marshal import marshal_obj
|
16
|
+
from omlish.lite.marshal import unmarshal_obj
|
17
|
+
from omlish.lite.subprocesses import subprocess_maybe_shell_wrap_exec
|
18
|
+
|
19
|
+
from ...pyremote import PyremoteBootstrapDriver
|
20
|
+
from ...pyremote import pyremote_bootstrap_finalize
|
21
|
+
from ...pyremote import pyremote_build_bootstrap_cmd
|
22
|
+
from .commands.subprocess import SubprocessCommand
|
23
|
+
|
24
|
+
|
25
|
+
##
|
26
|
+
|
27
|
+
|
28
|
+
def _send_obj(f: ta.IO, o: ta.Any) -> None:
|
29
|
+
j = json_dumps_compact(marshal_obj(o))
|
30
|
+
d = j.encode('utf-8')
|
31
|
+
|
32
|
+
f.write(struct.pack('<I', len(d)))
|
33
|
+
f.write(d)
|
34
|
+
f.flush()
|
35
|
+
|
36
|
+
|
37
|
+
def _recv_obj(f: ta.IO, ty: type) -> ta.Any:
|
38
|
+
d = f.read(4)
|
39
|
+
if not d:
|
40
|
+
return None
|
41
|
+
if len(d) != 4:
|
42
|
+
raise Exception
|
43
|
+
|
44
|
+
sz = struct.unpack('<I', d)[0]
|
45
|
+
d = f.read(sz)
|
46
|
+
if not d:
|
47
|
+
raise Exception
|
48
|
+
|
49
|
+
j = json.loads(d.decode('utf-8'))
|
50
|
+
return unmarshal_obj(j, ty)
|
51
|
+
|
52
|
+
|
53
|
+
def _remote_main() -> None:
|
54
|
+
rt = pyremote_bootstrap_finalize() # noqa
|
55
|
+
|
56
|
+
while True:
|
57
|
+
i = _recv_obj(rt.input, SubprocessCommand.Input)
|
58
|
+
if i is None:
|
59
|
+
break
|
60
|
+
|
61
|
+
o = SubprocessCommand()._execute(i) # noqa
|
62
|
+
|
63
|
+
_send_obj(sys.stdout.buffer, o)
|
64
|
+
|
65
|
+
|
66
|
+
def _main() -> None:
|
67
|
+
import argparse
|
68
|
+
|
69
|
+
parser = argparse.ArgumentParser()
|
70
|
+
|
71
|
+
parser.add_argument('--ssh')
|
72
|
+
parser.add_argument('--python', default='python3')
|
73
|
+
parser.add_argument('--_amalg-file')
|
74
|
+
|
75
|
+
args = parser.parse_args()
|
76
|
+
|
77
|
+
#
|
78
|
+
|
79
|
+
self_src = inspect.getsource(sys.modules[__name__])
|
80
|
+
self_src_lines = self_src.splitlines()
|
81
|
+
for l in self_src_lines:
|
82
|
+
if l.startswith('# @omlish-amalg-output '):
|
83
|
+
is_self_amalg = True
|
84
|
+
break
|
85
|
+
else:
|
86
|
+
is_self_amalg = False
|
87
|
+
|
88
|
+
if is_self_amalg:
|
89
|
+
amalg_src = self_src
|
90
|
+
else:
|
91
|
+
amalg_file = args._amalg_file # noqa
|
92
|
+
if amalg_file is None:
|
93
|
+
amalg_file = os.path.join(os.path.dirname(__file__), '_manage.py')
|
94
|
+
with open(amalg_file) as f:
|
95
|
+
amalg_src = f.read()
|
96
|
+
|
97
|
+
#
|
98
|
+
|
99
|
+
remote_src = '\n\n'.join([
|
100
|
+
'__name__ = "__remote__"',
|
101
|
+
amalg_src,
|
102
|
+
'_remote_main()',
|
103
|
+
])
|
104
|
+
|
105
|
+
#
|
106
|
+
|
107
|
+
bs_src = pyremote_build_bootstrap_cmd(__package__ or 'manage')
|
108
|
+
|
109
|
+
if args.ssh is not None:
|
110
|
+
sh_src = ' '.join([args.python, '-c', shlex.quote(bs_src)])
|
111
|
+
sh_cmd = f'{args.ssh} {shlex.quote(sh_src)}'
|
112
|
+
cmd = [sh_cmd]
|
113
|
+
shell = True
|
114
|
+
else:
|
115
|
+
cmd = [args.python, '-c', bs_src]
|
116
|
+
shell = False
|
117
|
+
|
118
|
+
proc = subprocess.Popen(
|
119
|
+
subprocess_maybe_shell_wrap_exec(*cmd),
|
120
|
+
shell=shell,
|
121
|
+
stdin=subprocess.PIPE,
|
122
|
+
stdout=subprocess.PIPE,
|
123
|
+
)
|
124
|
+
|
125
|
+
stdin = check_not_none(proc.stdin)
|
126
|
+
stdout = check_not_none(proc.stdout)
|
127
|
+
|
128
|
+
res = PyremoteBootstrapDriver(remote_src).run(stdin, stdout)
|
129
|
+
print(res)
|
130
|
+
|
131
|
+
#
|
132
|
+
|
133
|
+
for ci in [
|
134
|
+
SubprocessCommand.Input(
|
135
|
+
args=['python3', '-'],
|
136
|
+
input=b'print(1)\n',
|
137
|
+
capture_stdout=True,
|
138
|
+
),
|
139
|
+
SubprocessCommand.Input(
|
140
|
+
args=['uname'],
|
141
|
+
capture_stdout=True,
|
142
|
+
),
|
143
|
+
]:
|
144
|
+
_send_obj(stdin, ci)
|
145
|
+
|
146
|
+
o = _recv_obj(stdout, SubprocessCommand.Output)
|
147
|
+
|
148
|
+
print(o)
|
149
|
+
|
150
|
+
try:
|
151
|
+
stdin.close()
|
152
|
+
except BrokenPipeError:
|
153
|
+
pass
|
154
|
+
|
155
|
+
proc.wait()
|
156
|
+
|
157
|
+
|
158
|
+
if __name__ == '__main__':
|
159
|
+
_main()
|
ominfra/pyremote.py
CHANGED
@@ -17,9 +17,6 @@ import textwrap
|
|
17
17
|
import typing as ta
|
18
18
|
import zlib
|
19
19
|
|
20
|
-
from omlish.lite.check import check_isinstance
|
21
|
-
from omlish.lite.check import check_none
|
22
|
-
|
23
20
|
|
24
21
|
##
|
25
22
|
|
@@ -32,8 +29,8 @@ _PYREMOTE_BOOTSTRAP_ARGV0_VAR = '_OPYR_ARGV0'
|
|
32
29
|
|
33
30
|
_PYREMOTE_BOOTSTRAP_ACK0 = b'OPYR000\n'
|
34
31
|
_PYREMOTE_BOOTSTRAP_ACK1 = b'OPYR001\n'
|
35
|
-
_PYREMOTE_BOOTSTRAP_ACK2 = b'
|
36
|
-
_PYREMOTE_BOOTSTRAP_ACK3 = b'
|
32
|
+
_PYREMOTE_BOOTSTRAP_ACK2 = b'OPYR002\n'
|
33
|
+
_PYREMOTE_BOOTSTRAP_ACK3 = b'OPYR003\n'
|
37
34
|
|
38
35
|
_PYREMOTE_BOOTSTRAP_PROC_TITLE_FMT = '(pyremote:%s)'
|
39
36
|
|
@@ -110,6 +107,9 @@ def _pyremote_bootstrap_main(context_name: str) -> None:
|
|
110
107
|
|
111
108
|
|
112
109
|
def pyremote_build_bootstrap_cmd(context_name: str) -> str:
|
110
|
+
if any(c in context_name for c in '\'"'):
|
111
|
+
raise NameError(context_name)
|
112
|
+
|
113
113
|
bs_src = textwrap.dedent(inspect.getsource(_pyremote_bootstrap_main))
|
114
114
|
|
115
115
|
for gl in [
|
@@ -136,6 +136,9 @@ def pyremote_build_bootstrap_cmd(context_name: str) -> str:
|
|
136
136
|
bs_z = zlib.compress(bs_src.encode('utf-8'))
|
137
137
|
bs_z64 = base64.encodebytes(bs_z).replace(b'\n', b'')
|
138
138
|
|
139
|
+
def dq_repr(o: ta.Any) -> str:
|
140
|
+
return '"' + repr(o)[1:-1] + '"'
|
141
|
+
|
139
142
|
stmts = [
|
140
143
|
f'import {", ".join(_PYREMOTE_BOOTSTRAP_IMPORTS)}',
|
141
144
|
f'exec(zlib.decompress(base64.decodebytes({bs_z64!r})))',
|
@@ -256,6 +259,8 @@ class PyremoteBootstrapDriver:
|
|
256
259
|
self._main_src = main_src
|
257
260
|
self._main_z = zlib.compress(main_src.encode('utf-8'))
|
258
261
|
|
262
|
+
#
|
263
|
+
|
259
264
|
@dc.dataclass(frozen=True)
|
260
265
|
class Read:
|
261
266
|
sz: int
|
@@ -272,7 +277,7 @@ class PyremoteBootstrapDriver:
|
|
272
277
|
pid: int
|
273
278
|
env_info: PyremoteEnvInfo
|
274
279
|
|
275
|
-
def
|
280
|
+
def gen(self) -> ta.Generator[ta.Union[Read, Write], ta.Optional[bytes], Result]:
|
276
281
|
# Read first ack
|
277
282
|
yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK0)
|
278
283
|
|
@@ -281,8 +286,8 @@ class PyremoteBootstrapDriver:
|
|
281
286
|
pid = struct.unpack('<Q', d)[0]
|
282
287
|
|
283
288
|
# Write main src
|
284
|
-
|
285
|
-
|
289
|
+
yield from self._write(struct.pack('<I', len(self._main_z)))
|
290
|
+
yield from self._write(self._main_z)
|
286
291
|
|
287
292
|
# Read second and third ack
|
288
293
|
yield from self._expect(_PYREMOTE_BOOTSTRAP_ACK1)
|
@@ -305,7 +310,9 @@ class PyremoteBootstrapDriver:
|
|
305
310
|
)
|
306
311
|
|
307
312
|
def _read(self, sz: int) -> ta.Generator[Read, bytes, bytes]:
|
308
|
-
d =
|
313
|
+
d = yield self.Read(sz)
|
314
|
+
if not isinstance(d, bytes):
|
315
|
+
raise self.ProtocolError(f'Expected bytes after read, got {d!r}')
|
309
316
|
if len(d) != sz:
|
310
317
|
raise self.ProtocolError(f'Read {len(d)} bytes, expected {sz}')
|
311
318
|
return d
|
@@ -315,17 +322,47 @@ class PyremoteBootstrapDriver:
|
|
315
322
|
if d != e:
|
316
323
|
raise self.ProtocolError(f'Read {d!r}, expected {e!r}')
|
317
324
|
|
325
|
+
def _write(self, d: bytes) -> ta.Generator[Write, ta.Optional[bytes], None]:
|
326
|
+
i = yield self.Write(d)
|
327
|
+
if i is not None:
|
328
|
+
raise self.ProtocolError('Unexpected input after write')
|
329
|
+
|
330
|
+
#
|
331
|
+
|
332
|
+
def run(self, stdin: ta.IO, stdout: ta.IO) -> Result:
|
333
|
+
gen = self.gen()
|
334
|
+
|
335
|
+
gi: ta.Optional[bytes] = None
|
336
|
+
while True:
|
337
|
+
try:
|
338
|
+
if gi is not None:
|
339
|
+
go = gen.send(gi)
|
340
|
+
else:
|
341
|
+
go = next(gen)
|
342
|
+
except StopIteration as e:
|
343
|
+
return e.value
|
344
|
+
|
345
|
+
if isinstance(go, self.Read):
|
346
|
+
gi = stdout.read(go.sz)
|
347
|
+
elif isinstance(go, self.Write):
|
348
|
+
gi = None
|
349
|
+
stdin.write(go.d)
|
350
|
+
stdin.flush()
|
351
|
+
else:
|
352
|
+
raise TypeError(go)
|
353
|
+
|
318
354
|
|
319
355
|
##
|
320
356
|
|
321
357
|
|
322
358
|
@dc.dataclass(frozen=True)
|
323
|
-
class
|
359
|
+
class PyremotePayloadRuntime:
|
324
360
|
input: ta.BinaryIO
|
325
361
|
main_src: str
|
362
|
+
env_info: PyremoteEnvInfo
|
326
363
|
|
327
364
|
|
328
|
-
def pyremote_bootstrap_finalize() ->
|
365
|
+
def pyremote_bootstrap_finalize() -> PyremotePayloadRuntime:
|
329
366
|
# Restore original argv0
|
330
367
|
sys.executable = os.environ.pop(_PYREMOTE_BOOTSTRAP_ARGV0_VAR)
|
331
368
|
|
@@ -351,7 +388,8 @@ def pyremote_bootstrap_finalize() -> PyremoteBootstrapPayloadRuntime:
|
|
351
388
|
os.write(1, _PYREMOTE_BOOTSTRAP_ACK3)
|
352
389
|
|
353
390
|
# Return
|
354
|
-
return
|
391
|
+
return PyremotePayloadRuntime(
|
355
392
|
input=os.fdopen(_PYREMOTE_BOOTSTRAP_COMM_FD, 'rb', 0),
|
356
393
|
main_src=main_src,
|
394
|
+
env_info=env_info,
|
357
395
|
)
|
ominfra/scripts/journald2aws.py
CHANGED
@@ -2289,6 +2289,13 @@ class PolymorphicObjMarshaler(ObjMarshaler):
|
|
2289
2289
|
impls_by_ty: ta.Mapping[type, Impl]
|
2290
2290
|
impls_by_tag: ta.Mapping[str, Impl]
|
2291
2291
|
|
2292
|
+
@classmethod
|
2293
|
+
def of(cls, impls: ta.Iterable[Impl]) -> 'PolymorphicObjMarshaler':
|
2294
|
+
return cls(
|
2295
|
+
{i.ty: i for i in impls},
|
2296
|
+
{i.tag: i for i in impls},
|
2297
|
+
)
|
2298
|
+
|
2292
2299
|
def marshal(self, o: ta.Any) -> ta.Any:
|
2293
2300
|
impl = self.impls_by_ty[type(o)]
|
2294
2301
|
return {impl.tag: impl.m.marshal(o)}
|
@@ -2376,7 +2383,7 @@ def _make_obj_marshaler(
|
|
2376
2383
|
) -> ObjMarshaler:
|
2377
2384
|
if isinstance(ty, type):
|
2378
2385
|
if abc.ABC in ty.__bases__:
|
2379
|
-
|
2386
|
+
return PolymorphicObjMarshaler.of([ # type: ignore
|
2380
2387
|
PolymorphicObjMarshaler.Impl(
|
2381
2388
|
ity,
|
2382
2389
|
ity.__qualname__,
|
@@ -2384,11 +2391,7 @@ def _make_obj_marshaler(
|
|
2384
2391
|
)
|
2385
2392
|
for ity in deep_subclasses(ty)
|
2386
2393
|
if abc.ABC not in ity.__bases__
|
2387
|
-
]
|
2388
|
-
return PolymorphicObjMarshaler(
|
2389
|
-
{i.ty: i for i in impls},
|
2390
|
-
{i.tag: i for i in impls},
|
2391
|
-
)
|
2394
|
+
])
|
2392
2395
|
|
2393
2396
|
if issubclass(ty, enum.Enum):
|
2394
2397
|
return EnumObjMarshaler(ty)
|
ominfra/scripts/supervisor.py
CHANGED
@@ -4861,6 +4861,13 @@ class PolymorphicObjMarshaler(ObjMarshaler):
|
|
4861
4861
|
impls_by_ty: ta.Mapping[type, Impl]
|
4862
4862
|
impls_by_tag: ta.Mapping[str, Impl]
|
4863
4863
|
|
4864
|
+
@classmethod
|
4865
|
+
def of(cls, impls: ta.Iterable[Impl]) -> 'PolymorphicObjMarshaler':
|
4866
|
+
return cls(
|
4867
|
+
{i.ty: i for i in impls},
|
4868
|
+
{i.tag: i for i in impls},
|
4869
|
+
)
|
4870
|
+
|
4864
4871
|
def marshal(self, o: ta.Any) -> ta.Any:
|
4865
4872
|
impl = self.impls_by_ty[type(o)]
|
4866
4873
|
return {impl.tag: impl.m.marshal(o)}
|
@@ -4948,7 +4955,7 @@ def _make_obj_marshaler(
|
|
4948
4955
|
) -> ObjMarshaler:
|
4949
4956
|
if isinstance(ty, type):
|
4950
4957
|
if abc.ABC in ty.__bases__:
|
4951
|
-
|
4958
|
+
return PolymorphicObjMarshaler.of([ # type: ignore
|
4952
4959
|
PolymorphicObjMarshaler.Impl(
|
4953
4960
|
ity,
|
4954
4961
|
ity.__qualname__,
|
@@ -4956,11 +4963,7 @@ def _make_obj_marshaler(
|
|
4956
4963
|
)
|
4957
4964
|
for ity in deep_subclasses(ty)
|
4958
4965
|
if abc.ABC not in ity.__bases__
|
4959
|
-
]
|
4960
|
-
return PolymorphicObjMarshaler(
|
4961
|
-
{i.ty: i for i in impls},
|
4962
|
-
{i.tag: i for i in impls},
|
4963
|
-
)
|
4966
|
+
])
|
4964
4967
|
|
4965
4968
|
if issubclass(ty, enum.Enum):
|
4966
4969
|
return EnumObjMarshaler(ty)
|
@@ -6182,6 +6185,7 @@ class CoroHttpServerConnectionFdIoHandler(SocketFdIoHandler):
|
|
6182
6185
|
*,
|
6183
6186
|
read_size: int = 0x10000,
|
6184
6187
|
write_size: int = 0x10000,
|
6188
|
+
log_handler: ta.Optional[ta.Callable[[CoroHttpServer, CoroHttpServer.AnyLogIo], None]] = None,
|
6185
6189
|
) -> None:
|
6186
6190
|
check_state(not sock.getblocking())
|
6187
6191
|
|
@@ -6190,6 +6194,7 @@ class CoroHttpServerConnectionFdIoHandler(SocketFdIoHandler):
|
|
6190
6194
|
self._handler = handler
|
6191
6195
|
self._read_size = read_size
|
6192
6196
|
self._write_size = write_size
|
6197
|
+
self._log_handler = log_handler
|
6193
6198
|
|
6194
6199
|
self._read_buf = ReadableListBuffer()
|
6195
6200
|
self._write_buf: IncrementalWriteBuffer | None = None
|
@@ -6224,7 +6229,8 @@ class CoroHttpServerConnectionFdIoHandler(SocketFdIoHandler):
|
|
6224
6229
|
break
|
6225
6230
|
|
6226
6231
|
if isinstance(o, CoroHttpServer.AnyLogIo):
|
6227
|
-
|
6232
|
+
if self._log_handler is not None:
|
6233
|
+
self._log_handler(self._coro_srv, o)
|
6228
6234
|
o = None
|
6229
6235
|
|
6230
6236
|
elif isinstance(o, CoroHttpServer.ReadIo):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ominfra
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev135
|
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.dev135
|
16
|
+
Requires-Dist: omlish==0.0.0.dev135
|
17
17
|
Provides-Extra: all
|
18
18
|
Requires-Dist: paramiko~=3.5; extra == "all"
|
19
19
|
Requires-Dist: asyncssh~=2.18; extra == "all"
|
@@ -3,7 +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=
|
6
|
+
ominfra/pyremote.py,sha256=z3D9nj26omHgl3_q_h7uSHRtgYu-Sb06fMQCqS69_QI,10289
|
7
7
|
ominfra/ssh.py,sha256=jQpc4WvkMckIfk4vILda8zFaeharRqc_6wxW50b0OjQ,5431
|
8
8
|
ominfra/threadworkers.py,sha256=oX4ubZn7h932saXpRIJu2MNhBExgGGMuGhdXarZxLJw,4948
|
9
9
|
ominfra/clouds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -30,7 +30,7 @@ ominfra/journald/tailer.py,sha256=5abcFMfgi7fnY9ZEQe2ZVobaJxjQkeu6d9Kagw33a1w,33
|
|
30
30
|
ominfra/manage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
31
31
|
ominfra/manage/manage.py,sha256=BttL8LFEknHZE_h2Pt5dAqbfUkv6qy43WI0raXBZ1a8,151
|
32
32
|
ominfra/manage/deploy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
|
-
ominfra/manage/deploy/_executor.py,sha256=
|
33
|
+
ominfra/manage/deploy/_executor.py,sha256=amAnQWG5PBrsYVqd7K6xILyq88mhTUZucTWtSenceTE,35466
|
34
34
|
ominfra/manage/deploy/configs.py,sha256=qi0kwT7G2NH7dXLOQic-u6R3yeadup_QtvrjwWIggbM,435
|
35
35
|
ominfra/manage/deploy/remote.py,sha256=WHHElLmYk6wEDC4R8s_jHi1z71CCuV3soqF3elzIWEM,2145
|
36
36
|
ominfra/manage/deploy/executor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
@@ -56,9 +56,15 @@ ominfra/manage/deploy/poly/runtime.py,sha256=G66AI-a27Wi6QYpG3M0ryqI7c5MnJkXt-_j
|
|
56
56
|
ominfra/manage/deploy/poly/site.py,sha256=QJwDDJoVm2-kxi4bxIrp-mn4y2qDLuW3CAUax3W8gv8,239
|
57
57
|
ominfra/manage/deploy/poly/supervisor.py,sha256=zkl6VQBcAZaMAhyR9DbbbqULcgFCDZoe9S_vP-mMFQ8,2289
|
58
58
|
ominfra/manage/deploy/poly/venv.py,sha256=BoipDEa4NTeodjf3L57KJfq9eGKLagFNKwD8pS4yrzA,1552
|
59
|
+
ominfra/manage/new/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
60
|
+
ominfra/manage/new/_manage.py,sha256=ycfNgyFofYs6f5jYV2SrAprGChQd-uVhWc79Tvd9iB0,40217
|
61
|
+
ominfra/manage/new/main.py,sha256=WeiBAM7HQosnDbKahRmDWNvNYUZaKH2d3ooaqk9kQ04,3558
|
62
|
+
ominfra/manage/new/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
63
|
+
ominfra/manage/new/commands/base.py,sha256=TTrHL213jf-ClVqToiNHuxQey1Yf6052E8u3E9hAf7Q,574
|
64
|
+
ominfra/manage/new/commands/subprocess.py,sha256=GpbD-cTorgCRg203lCl81HAh-NBYA6ObKa5ZP2ss9rg,1884
|
59
65
|
ominfra/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
60
|
-
ominfra/scripts/journald2aws.py,sha256=
|
61
|
-
ominfra/scripts/supervisor.py,sha256=
|
66
|
+
ominfra/scripts/journald2aws.py,sha256=kCyeyCo53GRoCKAdVAe0aGkgmINxi8IBcUfRXphACek,131618
|
67
|
+
ominfra/scripts/supervisor.py,sha256=GO_e3e6WWqdBE-WejtaTrzU8yjtZBiadD-o2Nb-aJ6o,245838
|
62
68
|
ominfra/supervisor/LICENSE.txt,sha256=yvqaMNsDhWxziHa9ien6qCW1SkZv-DQlAg96XjfSee8,1746
|
63
69
|
ominfra/supervisor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
64
70
|
ominfra/supervisor/__main__.py,sha256=I0yFw-C08OOiZ3BF6lF1Oiv789EQXu-_j6whDhQUTEA,66
|
@@ -100,9 +106,9 @@ ominfra/tailscale/api.py,sha256=C5-t_b6jZXUWcy5k8bXm7CFnk73pSdrlMOgGDeGVrpw,1370
|
|
100
106
|
ominfra/tailscale/cli.py,sha256=DSGp4hn5xwOW-l_u_InKlSF6kIobxtUtVssf_73STs0,3567
|
101
107
|
ominfra/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
102
108
|
ominfra/tools/listresources.py,sha256=4qVg5txsb10EHhvqXXeM6gJ2jx9LbroEnPydDv1uXs0,6176
|
103
|
-
ominfra-0.0.0.
|
104
|
-
ominfra-0.0.0.
|
105
|
-
ominfra-0.0.0.
|
106
|
-
ominfra-0.0.0.
|
107
|
-
ominfra-0.0.0.
|
108
|
-
ominfra-0.0.0.
|
109
|
+
ominfra-0.0.0.dev135.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
110
|
+
ominfra-0.0.0.dev135.dist-info/METADATA,sha256=l8zW4aJP_w8h0b-wfdGnlXqPlofGjiw0HLQAfdFfJK4,731
|
111
|
+
ominfra-0.0.0.dev135.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
112
|
+
ominfra-0.0.0.dev135.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
|
113
|
+
ominfra-0.0.0.dev135.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
|
114
|
+
ominfra-0.0.0.dev135.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|