ominfra 0.0.0.dev123__py3-none-any.whl → 0.0.0.dev124__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- ominfra/deploy/_executor.py +7 -4
- ominfra/deploy/poly/_main.py +2 -4
- ominfra/pyremote/_runcommands.py +7 -4
- ominfra/scripts/journald2aws.py +7 -4
- ominfra/scripts/supervisor.py +1104 -13
- ominfra/supervisor/LICENSE.txt +28 -0
- ominfra/supervisor/inject.py +81 -0
- ominfra/supervisor/main.py +9 -74
- {ominfra-0.0.0.dev123.dist-info → ominfra-0.0.0.dev124.dist-info}/METADATA +7 -8
- {ominfra-0.0.0.dev123.dist-info → ominfra-0.0.0.dev124.dist-info}/RECORD +14 -12
- {ominfra-0.0.0.dev123.dist-info → ominfra-0.0.0.dev124.dist-info}/WHEEL +1 -1
- {ominfra-0.0.0.dev123.dist-info → ominfra-0.0.0.dev124.dist-info}/LICENSE +0 -0
- {ominfra-0.0.0.dev123.dist-info → ominfra-0.0.0.dev124.dist-info}/entry_points.txt +0 -0
- {ominfra-0.0.0.dev123.dist-info → ominfra-0.0.0.dev124.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
Supervisor is licensed under the following license:
|
2
|
+
|
3
|
+
A copyright notice accompanies this license document that identifies the copyright holders.
|
4
|
+
|
5
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
|
6
|
+
following conditions are met:
|
7
|
+
|
8
|
+
1. Redistributions in source code must retain the accompanying copyright notice, this list of conditions, and the
|
9
|
+
following disclaimer.
|
10
|
+
|
11
|
+
2. Redistributions in binary form must reproduce the accompanying copyright notice, this list of conditions, and the
|
12
|
+
following disclaimer in the documentation and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
3. Names of the copyright holders must not be used to endorse or promote products derived from this software without
|
15
|
+
prior written permission from the copyright holders.
|
16
|
+
|
17
|
+
4. If any files are modified, you must cause the modified files to carry prominent notices stating that you changed
|
18
|
+
the files and the date of any change.
|
19
|
+
|
20
|
+
Disclaimer
|
21
|
+
|
22
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
|
23
|
+
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
24
|
+
EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
26
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
27
|
+
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
28
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
import functools
|
3
|
+
import typing as ta
|
4
|
+
|
5
|
+
from omlish.lite.inject import Injector
|
6
|
+
from omlish.lite.inject import InjectorBindingOrBindings
|
7
|
+
from omlish.lite.inject import InjectorBindings
|
8
|
+
from omlish.lite.inject import inj
|
9
|
+
|
10
|
+
from .configs import ProcessConfig
|
11
|
+
from .configs import ProcessGroupConfig
|
12
|
+
from .configs import ServerConfig
|
13
|
+
from .context import ServerContext
|
14
|
+
from .context import ServerEpoch
|
15
|
+
from .events import EventCallbacks
|
16
|
+
from .groups import ProcessGroup
|
17
|
+
from .groups import SubprocessFactory
|
18
|
+
from .poller import Poller
|
19
|
+
from .poller import get_poller_impl
|
20
|
+
from .process import InheritedFds
|
21
|
+
from .process import Subprocess
|
22
|
+
from .signals import SignalReceiver
|
23
|
+
from .supervisor import ProcessGroupFactory
|
24
|
+
from .supervisor import ProcessGroups
|
25
|
+
from .supervisor import SignalHandler
|
26
|
+
from .supervisor import Supervisor
|
27
|
+
from .types import AbstractProcessGroup
|
28
|
+
from .types import AbstractServerContext
|
29
|
+
from .types import AbstractSubprocess
|
30
|
+
|
31
|
+
|
32
|
+
##
|
33
|
+
|
34
|
+
|
35
|
+
def bind_server(
|
36
|
+
config: ServerConfig,
|
37
|
+
*,
|
38
|
+
server_epoch: ta.Optional[ServerEpoch] = None,
|
39
|
+
inherited_fds: ta.Optional[InheritedFds] = None,
|
40
|
+
) -> InjectorBindings:
|
41
|
+
lst: ta.List[InjectorBindingOrBindings] = [
|
42
|
+
inj.bind(config),
|
43
|
+
|
44
|
+
inj.bind(get_poller_impl(), key=Poller, singleton=True),
|
45
|
+
|
46
|
+
inj.bind(ServerContext, singleton=True),
|
47
|
+
inj.bind(AbstractServerContext, to_key=ServerContext),
|
48
|
+
|
49
|
+
inj.bind(EventCallbacks, singleton=True),
|
50
|
+
|
51
|
+
inj.bind(SignalReceiver, singleton=True),
|
52
|
+
|
53
|
+
inj.bind(SignalHandler, singleton=True),
|
54
|
+
inj.bind(ProcessGroups, singleton=True),
|
55
|
+
inj.bind(Supervisor, singleton=True),
|
56
|
+
]
|
57
|
+
|
58
|
+
#
|
59
|
+
|
60
|
+
def make_process_group_factory(injector: Injector) -> ProcessGroupFactory:
|
61
|
+
def inner(group_config: ProcessGroupConfig) -> ProcessGroup:
|
62
|
+
return injector.inject(functools.partial(ProcessGroup, group_config))
|
63
|
+
return ProcessGroupFactory(inner)
|
64
|
+
lst.append(inj.bind(make_process_group_factory))
|
65
|
+
|
66
|
+
def make_subprocess_factory(injector: Injector) -> SubprocessFactory:
|
67
|
+
def inner(process_config: ProcessConfig, group: AbstractProcessGroup) -> AbstractSubprocess:
|
68
|
+
return injector.inject(functools.partial(Subprocess, process_config, group))
|
69
|
+
return SubprocessFactory(inner)
|
70
|
+
lst.append(inj.bind(make_subprocess_factory))
|
71
|
+
|
72
|
+
#
|
73
|
+
|
74
|
+
if server_epoch is not None:
|
75
|
+
lst.append(inj.bind(server_epoch, key=ServerEpoch))
|
76
|
+
if inherited_fds is not None:
|
77
|
+
lst.append(inj.bind(inherited_fds, key=InheritedFds))
|
78
|
+
|
79
|
+
#
|
80
|
+
|
81
|
+
return inj.as_bindings(*lst)
|
ominfra/supervisor/main.py
CHANGED
@@ -1,41 +1,24 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
# ruff: noqa: UP006 UP007
|
3
3
|
# @omlish-amalg ../scripts/supervisor.py
|
4
|
-
import functools
|
5
4
|
import itertools
|
6
5
|
import os.path
|
7
6
|
import typing as ta
|
8
7
|
|
9
|
-
from omlish.lite.
|
10
|
-
from omlish.lite.inject import InjectorBindingOrBindings
|
11
|
-
from omlish.lite.inject import InjectorBindings
|
8
|
+
from omlish.lite.http.coroserver import CoroHttpServer
|
12
9
|
from omlish.lite.inject import inj
|
13
10
|
from omlish.lite.journald import journald_log_handler_factory
|
14
11
|
from omlish.lite.logs import configure_standard_logging
|
15
12
|
|
16
13
|
from ..configs import read_config_file
|
17
|
-
from .configs import ProcessConfig
|
18
|
-
from .configs import ProcessGroupConfig
|
19
14
|
from .configs import ServerConfig
|
20
15
|
from .configs import prepare_server_config
|
21
16
|
from .context import ServerContext
|
22
17
|
from .context import ServerEpoch
|
23
|
-
from .
|
24
|
-
from .groups import ProcessGroup
|
25
|
-
from .groups import SubprocessFactory
|
26
|
-
from .poller import Poller
|
27
|
-
from .poller import get_poller_impl
|
18
|
+
from .inject import bind_server
|
28
19
|
from .process import InheritedFds
|
29
|
-
from .process import Subprocess
|
30
|
-
from .signals import SignalReceiver
|
31
20
|
from .states import SupervisorState
|
32
|
-
from .supervisor import ProcessGroupFactory
|
33
|
-
from .supervisor import ProcessGroups
|
34
|
-
from .supervisor import SignalHandler
|
35
21
|
from .supervisor import Supervisor
|
36
|
-
from .types import AbstractProcessGroup
|
37
|
-
from .types import AbstractServerContext
|
38
|
-
from .types import AbstractSubprocess
|
39
22
|
from .utils import ExitNow
|
40
23
|
from .utils import get_open_fds
|
41
24
|
|
@@ -43,63 +26,15 @@ from .utils import get_open_fds
|
|
43
26
|
##
|
44
27
|
|
45
28
|
|
46
|
-
def build_server_bindings(
|
47
|
-
config: ServerConfig,
|
48
|
-
*,
|
49
|
-
server_epoch: ta.Optional[ServerEpoch] = None,
|
50
|
-
inherited_fds: ta.Optional[InheritedFds] = None,
|
51
|
-
) -> InjectorBindings:
|
52
|
-
lst: ta.List[InjectorBindingOrBindings] = [
|
53
|
-
inj.bind(config),
|
54
|
-
|
55
|
-
inj.bind(get_poller_impl(), key=Poller, singleton=True),
|
56
|
-
|
57
|
-
inj.bind(ServerContext, singleton=True),
|
58
|
-
inj.bind(AbstractServerContext, to_key=ServerContext),
|
59
|
-
|
60
|
-
inj.bind(EventCallbacks, singleton=True),
|
61
|
-
|
62
|
-
inj.bind(SignalReceiver, singleton=True),
|
63
|
-
|
64
|
-
inj.bind(SignalHandler, singleton=True),
|
65
|
-
inj.bind(ProcessGroups, singleton=True),
|
66
|
-
inj.bind(Supervisor, singleton=True),
|
67
|
-
]
|
68
|
-
|
69
|
-
#
|
70
|
-
|
71
|
-
def make_process_group_factory(injector: Injector) -> ProcessGroupFactory:
|
72
|
-
def inner(group_config: ProcessGroupConfig) -> ProcessGroup:
|
73
|
-
return injector.inject(functools.partial(ProcessGroup, group_config))
|
74
|
-
return ProcessGroupFactory(inner)
|
75
|
-
lst.append(inj.bind(make_process_group_factory))
|
76
|
-
|
77
|
-
def make_subprocess_factory(injector: Injector) -> SubprocessFactory:
|
78
|
-
def inner(process_config: ProcessConfig, group: AbstractProcessGroup) -> AbstractSubprocess:
|
79
|
-
return injector.inject(functools.partial(Subprocess, process_config, group))
|
80
|
-
return SubprocessFactory(inner)
|
81
|
-
lst.append(inj.bind(make_subprocess_factory))
|
82
|
-
|
83
|
-
#
|
84
|
-
|
85
|
-
if server_epoch is not None:
|
86
|
-
lst.append(inj.bind(server_epoch, key=ServerEpoch))
|
87
|
-
if inherited_fds is not None:
|
88
|
-
lst.append(inj.bind(inherited_fds, key=InheritedFds))
|
89
|
-
|
90
|
-
#
|
91
|
-
|
92
|
-
return inj.as_bindings(*lst)
|
93
|
-
|
94
|
-
|
95
|
-
##
|
96
|
-
|
97
|
-
|
98
29
|
def main(
|
99
30
|
argv: ta.Optional[ta.Sequence[str]] = None,
|
100
31
|
*,
|
101
32
|
no_logging: bool = False,
|
102
33
|
) -> None:
|
34
|
+
server_cls = CoroHttpServer # noqa
|
35
|
+
|
36
|
+
#
|
37
|
+
|
103
38
|
import argparse
|
104
39
|
|
105
40
|
parser = argparse.ArgumentParser()
|
@@ -133,14 +68,14 @@ def main(
|
|
133
68
|
prepare=prepare_server_config,
|
134
69
|
)
|
135
70
|
|
136
|
-
injector = inj.create_injector(
|
71
|
+
injector = inj.create_injector(bind_server(
|
137
72
|
config,
|
138
73
|
server_epoch=ServerEpoch(epoch),
|
139
74
|
inherited_fds=inherited_fds,
|
140
75
|
))
|
141
76
|
|
142
|
-
context = injector
|
143
|
-
supervisor = injector
|
77
|
+
context = injector[ServerContext]
|
78
|
+
supervisor = injector[Supervisor]
|
144
79
|
|
145
80
|
try:
|
146
81
|
supervisor.main()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ominfra
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev124
|
4
4
|
Summary: ominfra
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -12,12 +12,11 @@ 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
|
16
|
-
Requires-Dist: omlish
|
15
|
+
Requires-Dist: omdev==0.0.0.dev124
|
16
|
+
Requires-Dist: omlish==0.0.0.dev124
|
17
17
|
Provides-Extra: all
|
18
|
-
Requires-Dist: paramiko
|
19
|
-
Requires-Dist: asyncssh
|
18
|
+
Requires-Dist: paramiko~=3.5; extra == "all"
|
19
|
+
Requires-Dist: asyncssh~=2.18; extra == "all"
|
20
20
|
Provides-Extra: ssh
|
21
|
-
Requires-Dist: paramiko
|
22
|
-
Requires-Dist: asyncssh
|
23
|
-
|
21
|
+
Requires-Dist: paramiko~=3.5; extra == "ssh"
|
22
|
+
Requires-Dist: asyncssh~=2.18; extra == "ssh"
|
@@ -22,7 +22,7 @@ ominfra/clouds/aws/journald2aws/poster.py,sha256=hz1XuctW8GtLmfjhRvCFY6py52D4BzX
|
|
22
22
|
ominfra/clouds/gcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
23
|
ominfra/clouds/gcp/auth.py,sha256=3PyfRJNgajjMqJFem3SKui0CqGeHEsZlvbRhuxFcZG8,1348
|
24
24
|
ominfra/deploy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
25
|
-
ominfra/deploy/_executor.py,sha256=
|
25
|
+
ominfra/deploy/_executor.py,sha256=AZ6F7zcVMQRKZwOxfFTfsrj1IA42bIrZF22jiDLapoE,34654
|
26
26
|
ominfra/deploy/configs.py,sha256=qi0kwT7G2NH7dXLOQic-u6R3yeadup_QtvrjwWIggbM,435
|
27
27
|
ominfra/deploy/remote.py,sha256=6ACmpXU1uBdyGs3Xsp97ktKFq30cJlzN9LRWNUWlGY4,2144
|
28
28
|
ominfra/deploy/executor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
@@ -37,7 +37,7 @@ ominfra/deploy/executor/concerns/systemd.py,sha256=MtsSEToEa1HNouern_JukcYTnypw_
|
|
37
37
|
ominfra/deploy/executor/concerns/user.py,sha256=j5LDfQXquIp-eEM7t6aShsrYoQrM_ILXZycTmTcRVxA,686
|
38
38
|
ominfra/deploy/executor/concerns/venv.py,sha256=jbRriqJHO4r9Zyo5Hfl_qVmcU6Qm6UgrouBroKcPn2g,775
|
39
39
|
ominfra/deploy/poly/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
40
|
-
ominfra/deploy/poly/_main.py,sha256=
|
40
|
+
ominfra/deploy/poly/_main.py,sha256=1I6fQY-_iUk4FmT1fQviSRQReuy4VCHQKGLenda1F_g,24176
|
41
41
|
ominfra/deploy/poly/base.py,sha256=Bd-CzUTaDvTRbdXKiTxMxs77WCEXItwNoBYCRnTk1u4,4167
|
42
42
|
ominfra/deploy/poly/configs.py,sha256=9bzWdbxhOk_Q4KokDjmRz254KHnUU71Vl1frLlhQyU4,584
|
43
43
|
ominfra/deploy/poly/deploy.py,sha256=tMYKslXLjstcv86siRt5j37USsS0Wd6lsfeGRE26zio,544
|
@@ -56,12 +56,13 @@ ominfra/journald/tailer.py,sha256=5abcFMfgi7fnY9ZEQe2ZVobaJxjQkeu6d9Kagw33a1w,33
|
|
56
56
|
ominfra/manage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
57
57
|
ominfra/manage/manage.py,sha256=BttL8LFEknHZE_h2Pt5dAqbfUkv6qy43WI0raXBZ1a8,151
|
58
58
|
ominfra/pyremote/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
59
|
-
ominfra/pyremote/_runcommands.py,sha256=
|
59
|
+
ominfra/pyremote/_runcommands.py,sha256=EDTp6NOgux8ZJw-tcIHtfafc-fHLh5KuhghA3Xemhy8,28490
|
60
60
|
ominfra/pyremote/bootstrap.py,sha256=RvMO3YGaN1E4sgUi1JEtiPak8cjvqtc_vRCq1yqbeZg,3370
|
61
61
|
ominfra/pyremote/runcommands.py,sha256=bviS0_TDIoZVAe4h-_iavbvJtVSFu8lnk7fQ5iasCWE,1571
|
62
62
|
ominfra/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
63
|
-
ominfra/scripts/journald2aws.py,sha256=
|
64
|
-
ominfra/scripts/supervisor.py,sha256=
|
63
|
+
ominfra/scripts/journald2aws.py,sha256=veQDwe0RQ3EYLW5jSsNJCUOx6RTLb_7FXUN7fBSgWUc,128540
|
64
|
+
ominfra/scripts/supervisor.py,sha256=eapWDO0oWjj_nAggu7LhzI3GgbmgjxD5HtSDRl20AgE,206584
|
65
|
+
ominfra/supervisor/LICENSE.txt,sha256=JRTq7xHjDCpDPCeo0OfCYymSm9Vwl7n7rQWg342NpxI,1780
|
65
66
|
ominfra/supervisor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
66
67
|
ominfra/supervisor/__main__.py,sha256=I0yFw-C08OOiZ3BF6lF1Oiv789EQXu-_j6whDhQUTEA,66
|
67
68
|
ominfra/supervisor/configs.py,sha256=TtVyWdxinrd3tueM6q8j2YVcEqauFTJqlbykkSjByEo,3524
|
@@ -71,7 +72,8 @@ ominfra/supervisor/dispatchers.py,sha256=rpcYYGb2CkCgmPMrxeN-jTxr-PZffZ1OA9lQr4F
|
|
71
72
|
ominfra/supervisor/events.py,sha256=01pet30KrzS4LszeKy0JUCMhMO8_OwuxvvDjfI_eGQQ,6593
|
72
73
|
ominfra/supervisor/exceptions.py,sha256=Qbu211H3CLlSmi9LsSikOwrcL5HgJP9ugvcKWlGTAoI,750
|
73
74
|
ominfra/supervisor/groups.py,sha256=VgFHgDwtCFumM8Qr5kbQ6e4xoau6tBQuW4lrKox_Z9o,4610
|
74
|
-
ominfra/supervisor/
|
75
|
+
ominfra/supervisor/inject.py,sha256=srRErrQkxytLSKUedN4HFoFF5Eb4f_TEw1eu0aKlHMU,2599
|
76
|
+
ominfra/supervisor/main.py,sha256=gd9tBBg46sJInxCk_OCkRFkAaQ3qhLKfjZeRXvU2LNY,2324
|
75
77
|
ominfra/supervisor/poller.py,sha256=-gY_GIjuYr0J6ql_tFwKhlzRN4_mQaiVgMDOEHx_54Y,7693
|
76
78
|
ominfra/supervisor/process.py,sha256=dpVG7eX8q9nsIA0uH7KrJwdZGbhtw6ZAXWG8LsMpWnY,28306
|
77
79
|
ominfra/supervisor/signals.py,sha256=tv1CJm3Xrb69KVSswqm_u2vr2Lb2AbTxBVtQqIOSeyk,1176
|
@@ -84,9 +86,9 @@ ominfra/tailscale/api.py,sha256=C5-t_b6jZXUWcy5k8bXm7CFnk73pSdrlMOgGDeGVrpw,1370
|
|
84
86
|
ominfra/tailscale/cli.py,sha256=DSGp4hn5xwOW-l_u_InKlSF6kIobxtUtVssf_73STs0,3567
|
85
87
|
ominfra/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
86
88
|
ominfra/tools/listresources.py,sha256=4qVg5txsb10EHhvqXXeM6gJ2jx9LbroEnPydDv1uXs0,6176
|
87
|
-
ominfra-0.0.0.
|
88
|
-
ominfra-0.0.0.
|
89
|
-
ominfra-0.0.0.
|
90
|
-
ominfra-0.0.0.
|
91
|
-
ominfra-0.0.0.
|
92
|
-
ominfra-0.0.0.
|
89
|
+
ominfra-0.0.0.dev124.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
90
|
+
ominfra-0.0.0.dev124.dist-info/METADATA,sha256=D1ueiVHDML8TevQC4EPHfEyeKZK_bfl2JY_lPoLxMkQ,731
|
91
|
+
ominfra-0.0.0.dev124.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
92
|
+
ominfra-0.0.0.dev124.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
|
93
|
+
ominfra-0.0.0.dev124.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
|
94
|
+
ominfra-0.0.0.dev124.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|