ominfra 0.0.0.dev150__py3-none-any.whl → 0.0.0.dev152__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/clouds/aws/journald2aws/driver.py +1 -1
- ominfra/manage/main.py +5 -7
- ominfra/manage/remote/_main.py +1 -1
- ominfra/scripts/journald2aws.py +69 -69
- ominfra/scripts/manage.py +84 -46
- ominfra/scripts/supervisor.py +158 -158
- ominfra/supervisor/main.py +1 -1
- {ominfra-0.0.0.dev150.dist-info → ominfra-0.0.0.dev152.dist-info}/METADATA +3 -3
- {ominfra-0.0.0.dev150.dist-info → ominfra-0.0.0.dev152.dist-info}/RECORD +13 -13
- {ominfra-0.0.0.dev150.dist-info → ominfra-0.0.0.dev152.dist-info}/LICENSE +0 -0
- {ominfra-0.0.0.dev150.dist-info → ominfra-0.0.0.dev152.dist-info}/WHEEL +0 -0
- {ominfra-0.0.0.dev150.dist-info → ominfra-0.0.0.dev152.dist-info}/entry_points.txt +0 -0
- {ominfra-0.0.0.dev150.dist-info → ominfra-0.0.0.dev152.dist-info}/top_level.txt +0 -0
@@ -41,8 +41,8 @@ from omlish.lite.cached import cached_nullary
|
|
41
41
|
from omlish.lite.check import check
|
42
42
|
from omlish.lite.contextmanagers import ExitStacked
|
43
43
|
from omlish.lite.logs import log
|
44
|
-
from omlish.lite.pidfile import Pidfile
|
45
44
|
from omlish.lite.runtime import is_debugger_attached
|
45
|
+
from omlish.os.pidfile import Pidfile
|
46
46
|
|
47
47
|
from ....journald.messages import JournalctlMessage # noqa
|
48
48
|
from ....journald.tailer import JournalctlTailerWorker
|
ominfra/manage/main.py
CHANGED
@@ -8,6 +8,7 @@ manage.py -s 'ssh -i /foo/bar.pem foo@bar.baz' -q --python=python3.8
|
|
8
8
|
import asyncio
|
9
9
|
import contextlib
|
10
10
|
import json
|
11
|
+
import sys
|
11
12
|
import typing as ta
|
12
13
|
|
13
14
|
from omlish.argparse.cli import ArgparseCli
|
@@ -31,7 +32,7 @@ from .remote.spawning import RemoteSpawning
|
|
31
32
|
|
32
33
|
class MainCli(ArgparseCli):
|
33
34
|
@argparse_command(
|
34
|
-
argparse_arg('--
|
35
|
+
argparse_arg('--_payload-file'),
|
35
36
|
|
36
37
|
argparse_arg('-s', '--shell'),
|
37
38
|
argparse_arg('-q', '--shell-quote', action='store_true'),
|
@@ -49,10 +50,7 @@ class MainCli(ArgparseCli):
|
|
49
50
|
|
50
51
|
argparse_arg('command', nargs='+'),
|
51
52
|
)
|
52
|
-
def run(self) -> None:
|
53
|
-
asyncio.run(self._async_run())
|
54
|
-
|
55
|
-
async def _async_run(self) -> None:
|
53
|
+
async def run(self) -> None:
|
56
54
|
bs = MainBootstrap(
|
57
55
|
main_config=MainConfig(
|
58
56
|
log_level='DEBUG' if self.args.debug else 'INFO',
|
@@ -61,7 +59,7 @@ class MainCli(ArgparseCli):
|
|
61
59
|
),
|
62
60
|
|
63
61
|
remote_config=RemoteConfig(
|
64
|
-
payload_file=self.args.
|
62
|
+
payload_file=self.args._payload_file, # noqa
|
65
63
|
|
66
64
|
pycharm_remote_debug=PycharmRemoteDebug(
|
67
65
|
port=self.args.pycharm_debug_port,
|
@@ -124,7 +122,7 @@ class MainCli(ArgparseCli):
|
|
124
122
|
|
125
123
|
|
126
124
|
def _main() -> None:
|
127
|
-
MainCli().
|
125
|
+
sys.exit(asyncio.run(MainCli().async_cli_run()))
|
128
126
|
|
129
127
|
|
130
128
|
if __name__ == '__main__':
|
ominfra/manage/remote/_main.py
CHANGED
@@ -12,11 +12,11 @@ from omlish.lite.asyncio.asyncio import asyncio_open_stream_reader
|
|
12
12
|
from omlish.lite.asyncio.asyncio import asyncio_open_stream_writer
|
13
13
|
from omlish.lite.cached import cached_nullary
|
14
14
|
from omlish.lite.check import check
|
15
|
-
from omlish.lite.deathsig import set_process_deathsig
|
16
15
|
from omlish.lite.inject import Injector
|
17
16
|
from omlish.lite.logs import log
|
18
17
|
from omlish.lite.marshal import ObjMarshalerManager
|
19
18
|
from omlish.lite.pycharm import pycharm_debug_connect
|
19
|
+
from omlish.os.deathsig import set_process_deathsig
|
20
20
|
|
21
21
|
from ...pyremote import pyremote_bootstrap_finalize
|
22
22
|
from ..bootstrap import MainBootstrap
|
ominfra/scripts/journald2aws.py
CHANGED
@@ -64,7 +64,7 @@ CallableT = ta.TypeVar('CallableT', bound=ta.Callable)
|
|
64
64
|
# ../../../../omlish/lite/check.py
|
65
65
|
SizedT = ta.TypeVar('SizedT', bound=ta.Sized)
|
66
66
|
CheckMessage = ta.Union[str, ta.Callable[..., ta.Optional[str]], None] # ta.TypeAlias
|
67
|
-
CheckLateConfigureFn = ta.Callable[['Checks'], None]
|
67
|
+
CheckLateConfigureFn = ta.Callable[['Checks'], None] # ta.TypeAlias
|
68
68
|
CheckOnRaiseFn = ta.Callable[[Exception], None] # ta.TypeAlias
|
69
69
|
CheckExceptionFactory = ta.Callable[..., Exception] # ta.TypeAlias
|
70
70
|
CheckArgsRenderer = ta.Callable[..., ta.Optional[str]] # ta.TypeAlias
|
@@ -79,7 +79,7 @@ ConfigMapping = ta.Mapping[str, ta.Any]
|
|
79
79
|
ThreadWorkerT = ta.TypeVar('ThreadWorkerT', bound='ThreadWorker')
|
80
80
|
|
81
81
|
# ../../../../omlish/lite/subprocesses.py
|
82
|
-
SubprocessChannelOption = ta.Literal['pipe', 'stdout', 'devnull']
|
82
|
+
SubprocessChannelOption = ta.Literal['pipe', 'stdout', 'devnull'] # ta.TypeAlias
|
83
83
|
|
84
84
|
|
85
85
|
########################################
|
@@ -1439,73 +1439,6 @@ json_dump_compact: ta.Callable[..., bytes] = functools.partial(json.dump, **JSON
|
|
1439
1439
|
json_dumps_compact: ta.Callable[..., str] = functools.partial(json.dumps, **JSON_COMPACT_KWARGS)
|
1440
1440
|
|
1441
1441
|
|
1442
|
-
########################################
|
1443
|
-
# ../../../../../omlish/lite/pidfile.py
|
1444
|
-
|
1445
|
-
|
1446
|
-
class Pidfile:
|
1447
|
-
def __init__(self, path: str) -> None:
|
1448
|
-
super().__init__()
|
1449
|
-
self._path = path
|
1450
|
-
|
1451
|
-
_f: ta.TextIO
|
1452
|
-
|
1453
|
-
def __repr__(self) -> str:
|
1454
|
-
return f'{self.__class__.__name__}({self._path!r})'
|
1455
|
-
|
1456
|
-
def __enter__(self) -> 'Pidfile':
|
1457
|
-
fd = os.open(self._path, os.O_RDWR | os.O_CREAT, 0o600)
|
1458
|
-
try:
|
1459
|
-
os.set_inheritable(fd, True)
|
1460
|
-
f = os.fdopen(fd, 'r+')
|
1461
|
-
except Exception:
|
1462
|
-
try:
|
1463
|
-
os.close(fd)
|
1464
|
-
except Exception: # noqa
|
1465
|
-
pass
|
1466
|
-
raise
|
1467
|
-
self._f = f
|
1468
|
-
return self
|
1469
|
-
|
1470
|
-
def __exit__(self, exc_type, exc_val, exc_tb):
|
1471
|
-
if hasattr(self, '_f'):
|
1472
|
-
self._f.close()
|
1473
|
-
del self._f
|
1474
|
-
|
1475
|
-
def try_lock(self) -> bool:
|
1476
|
-
try:
|
1477
|
-
fcntl.flock(self._f, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
1478
|
-
return True
|
1479
|
-
except OSError:
|
1480
|
-
return False
|
1481
|
-
|
1482
|
-
def ensure_locked(self) -> None:
|
1483
|
-
if not self.try_lock():
|
1484
|
-
raise RuntimeError('Could not get lock')
|
1485
|
-
|
1486
|
-
def write(self, pid: ta.Optional[int] = None) -> None:
|
1487
|
-
self.ensure_locked()
|
1488
|
-
if pid is None:
|
1489
|
-
pid = os.getpid()
|
1490
|
-
self._f.write(f'{pid}\n')
|
1491
|
-
self._f.flush()
|
1492
|
-
|
1493
|
-
def clear(self) -> None:
|
1494
|
-
self.ensure_locked()
|
1495
|
-
self._f.seek(0)
|
1496
|
-
self._f.truncate()
|
1497
|
-
|
1498
|
-
def read(self) -> int:
|
1499
|
-
if self.try_lock():
|
1500
|
-
raise RuntimeError('Got lock')
|
1501
|
-
self._f.seek(0)
|
1502
|
-
return int(self._f.read())
|
1503
|
-
|
1504
|
-
def kill(self, sig: int = signal.SIGTERM) -> None:
|
1505
|
-
pid = self.read()
|
1506
|
-
os.kill(pid, sig) # FIXME: Still racy
|
1507
|
-
|
1508
|
-
|
1509
1442
|
########################################
|
1510
1443
|
# ../../../../../omlish/lite/reflect.py
|
1511
1444
|
|
@@ -1628,6 +1561,73 @@ def format_num_bytes(num_bytes: int) -> str:
|
|
1628
1561
|
return f'{num_bytes / 1024 ** (len(FORMAT_NUM_BYTES_SUFFIXES) - 1):.2f}{FORMAT_NUM_BYTES_SUFFIXES[-1]}'
|
1629
1562
|
|
1630
1563
|
|
1564
|
+
########################################
|
1565
|
+
# ../../../../../omlish/os/pidfile.py
|
1566
|
+
|
1567
|
+
|
1568
|
+
class Pidfile:
|
1569
|
+
def __init__(self, path: str) -> None:
|
1570
|
+
super().__init__()
|
1571
|
+
self._path = path
|
1572
|
+
|
1573
|
+
_f: ta.TextIO
|
1574
|
+
|
1575
|
+
def __repr__(self) -> str:
|
1576
|
+
return f'{self.__class__.__name__}({self._path!r})'
|
1577
|
+
|
1578
|
+
def __enter__(self) -> 'Pidfile':
|
1579
|
+
fd = os.open(self._path, os.O_RDWR | os.O_CREAT, 0o600)
|
1580
|
+
try:
|
1581
|
+
os.set_inheritable(fd, True)
|
1582
|
+
f = os.fdopen(fd, 'r+')
|
1583
|
+
except Exception:
|
1584
|
+
try:
|
1585
|
+
os.close(fd)
|
1586
|
+
except Exception: # noqa
|
1587
|
+
pass
|
1588
|
+
raise
|
1589
|
+
self._f = f
|
1590
|
+
return self
|
1591
|
+
|
1592
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
1593
|
+
if hasattr(self, '_f'):
|
1594
|
+
self._f.close()
|
1595
|
+
del self._f
|
1596
|
+
|
1597
|
+
def try_lock(self) -> bool:
|
1598
|
+
try:
|
1599
|
+
fcntl.flock(self._f, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
1600
|
+
return True
|
1601
|
+
except OSError:
|
1602
|
+
return False
|
1603
|
+
|
1604
|
+
def ensure_locked(self) -> None:
|
1605
|
+
if not self.try_lock():
|
1606
|
+
raise RuntimeError('Could not get lock')
|
1607
|
+
|
1608
|
+
def write(self, pid: ta.Optional[int] = None) -> None:
|
1609
|
+
self.ensure_locked()
|
1610
|
+
if pid is None:
|
1611
|
+
pid = os.getpid()
|
1612
|
+
self._f.write(f'{pid}\n')
|
1613
|
+
self._f.flush()
|
1614
|
+
|
1615
|
+
def clear(self) -> None:
|
1616
|
+
self.ensure_locked()
|
1617
|
+
self._f.seek(0)
|
1618
|
+
self._f.truncate()
|
1619
|
+
|
1620
|
+
def read(self) -> int:
|
1621
|
+
if self.try_lock():
|
1622
|
+
raise RuntimeError('Got lock')
|
1623
|
+
self._f.seek(0)
|
1624
|
+
return int(self._f.read())
|
1625
|
+
|
1626
|
+
def kill(self, sig: int = signal.SIGTERM) -> None:
|
1627
|
+
pid = self.read()
|
1628
|
+
os.kill(pid, sig) # FIXME: Still racy
|
1629
|
+
|
1630
|
+
|
1631
1631
|
########################################
|
1632
1632
|
# ../../auth.py
|
1633
1633
|
"""
|
ominfra/scripts/manage.py
CHANGED
@@ -78,7 +78,7 @@ CallableT = ta.TypeVar('CallableT', bound=ta.Callable)
|
|
78
78
|
# ../../omlish/lite/check.py
|
79
79
|
SizedT = ta.TypeVar('SizedT', bound=ta.Sized)
|
80
80
|
CheckMessage = ta.Union[str, ta.Callable[..., ta.Optional[str]], None] # ta.TypeAlias
|
81
|
-
CheckLateConfigureFn = ta.Callable[['Checks'], None]
|
81
|
+
CheckLateConfigureFn = ta.Callable[['Checks'], None] # ta.TypeAlias
|
82
82
|
CheckOnRaiseFn = ta.Callable[[Exception], None] # ta.TypeAlias
|
83
83
|
CheckExceptionFactory = ta.Callable[..., Exception] # ta.TypeAlias
|
84
84
|
CheckArgsRenderer = ta.Callable[..., ta.Optional[str]] # ta.TypeAlias
|
@@ -103,7 +103,7 @@ InjectorProviderFnMap = ta.Mapping['InjectorKey', 'InjectorProviderFn']
|
|
103
103
|
InjectorBindingOrBindings = ta.Union['InjectorBinding', 'InjectorBindings']
|
104
104
|
|
105
105
|
# ../../omlish/lite/subprocesses.py
|
106
|
-
SubprocessChannelOption = ta.Literal['pipe', 'stdout', 'devnull']
|
106
|
+
SubprocessChannelOption = ta.Literal['pipe', 'stdout', 'devnull'] # ta.TypeAlias
|
107
107
|
|
108
108
|
|
109
109
|
########################################
|
@@ -1611,30 +1611,6 @@ class Checks:
|
|
1611
1611
|
check = Checks()
|
1612
1612
|
|
1613
1613
|
|
1614
|
-
########################################
|
1615
|
-
# ../../../omlish/lite/deathsig.py
|
1616
|
-
|
1617
|
-
|
1618
|
-
LINUX_PR_SET_PDEATHSIG = 1 # Second arg is a signal
|
1619
|
-
LINUX_PR_GET_PDEATHSIG = 2 # Second arg is a ptr to return the signal
|
1620
|
-
|
1621
|
-
|
1622
|
-
def set_process_deathsig(sig: int) -> bool:
|
1623
|
-
if sys.platform == 'linux':
|
1624
|
-
libc = ct.CDLL('libc.so.6')
|
1625
|
-
|
1626
|
-
# int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);
|
1627
|
-
libc.prctl.restype = ct.c_int
|
1628
|
-
libc.prctl.argtypes = [ct.c_int, ct.c_ulong, ct.c_ulong, ct.c_ulong, ct.c_ulong]
|
1629
|
-
|
1630
|
-
libc.prctl(LINUX_PR_SET_PDEATHSIG, sig, 0, 0, 0, 0)
|
1631
|
-
|
1632
|
-
return True
|
1633
|
-
|
1634
|
-
else:
|
1635
|
-
return False
|
1636
|
-
|
1637
|
-
|
1638
1614
|
########################################
|
1639
1615
|
# ../../../omlish/lite/json.py
|
1640
1616
|
|
@@ -1880,6 +1856,30 @@ def format_num_bytes(num_bytes: int) -> str:
|
|
1880
1856
|
return f'{num_bytes / 1024 ** (len(FORMAT_NUM_BYTES_SUFFIXES) - 1):.2f}{FORMAT_NUM_BYTES_SUFFIXES[-1]}'
|
1881
1857
|
|
1882
1858
|
|
1859
|
+
########################################
|
1860
|
+
# ../../../omlish/os/deathsig.py
|
1861
|
+
|
1862
|
+
|
1863
|
+
LINUX_PR_SET_PDEATHSIG = 1 # Second arg is a signal
|
1864
|
+
LINUX_PR_GET_PDEATHSIG = 2 # Second arg is a ptr to return the signal
|
1865
|
+
|
1866
|
+
|
1867
|
+
def set_process_deathsig(sig: int) -> bool:
|
1868
|
+
if sys.platform == 'linux':
|
1869
|
+
libc = ct.CDLL('libc.so.6')
|
1870
|
+
|
1871
|
+
# int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);
|
1872
|
+
libc.prctl.restype = ct.c_int
|
1873
|
+
libc.prctl.argtypes = [ct.c_int, ct.c_ulong, ct.c_ulong, ct.c_ulong, ct.c_ulong]
|
1874
|
+
|
1875
|
+
libc.prctl(LINUX_PR_SET_PDEATHSIG, sig, 0, 0, 0, 0)
|
1876
|
+
|
1877
|
+
return True
|
1878
|
+
|
1879
|
+
else:
|
1880
|
+
return False
|
1881
|
+
|
1882
|
+
|
1883
1883
|
########################################
|
1884
1884
|
# ../../../omdev/packaging/specifiers.py
|
1885
1885
|
# Copyright (c) Donald Stufft and individual contributors.
|
@@ -2618,6 +2618,8 @@ def get_remote_payload_src(
|
|
2618
2618
|
TODO:
|
2619
2619
|
- default command
|
2620
2620
|
- auto match all underscores to hyphens
|
2621
|
+
- pre-run, post-run hooks
|
2622
|
+
- exitstack?
|
2621
2623
|
"""
|
2622
2624
|
|
2623
2625
|
|
@@ -2737,11 +2739,12 @@ class ArgparseCli:
|
|
2737
2739
|
|
2738
2740
|
self._args, self._unknown_args = self.get_parser().parse_known_args(self._argv)
|
2739
2741
|
|
2742
|
+
#
|
2743
|
+
|
2740
2744
|
def __init_subclass__(cls, **kwargs: ta.Any) -> None:
|
2741
2745
|
super().__init_subclass__(**kwargs)
|
2742
2746
|
|
2743
2747
|
ns = cls.__dict__
|
2744
|
-
|
2745
2748
|
objs = {}
|
2746
2749
|
mro = cls.__mro__[::-1]
|
2747
2750
|
for bns in [bcls.__dict__ for bcls in reversed(mro)] + [ns]:
|
@@ -2754,24 +2757,33 @@ class ArgparseCli:
|
|
2754
2757
|
elif k in objs:
|
2755
2758
|
del [k]
|
2756
2759
|
|
2760
|
+
#
|
2761
|
+
|
2757
2762
|
anns = ta.get_type_hints(_ArgparseCliAnnotationBox({
|
2758
2763
|
**{k: v for bcls in reversed(mro) for k, v in getattr(bcls, '__annotations__', {}).items()},
|
2759
2764
|
**ns.get('__annotations__', {}),
|
2760
2765
|
}), globalns=ns.get('__globals__', {}))
|
2761
2766
|
|
2767
|
+
#
|
2768
|
+
|
2762
2769
|
if '_parser' in ns:
|
2763
2770
|
parser = check.isinstance(ns['_parser'], argparse.ArgumentParser)
|
2764
2771
|
else:
|
2765
2772
|
parser = argparse.ArgumentParser()
|
2766
2773
|
setattr(cls, '_parser', parser)
|
2767
2774
|
|
2775
|
+
#
|
2776
|
+
|
2768
2777
|
subparsers = parser.add_subparsers()
|
2778
|
+
|
2769
2779
|
for att, obj in objs.items():
|
2770
2780
|
if isinstance(obj, ArgparseCommand):
|
2771
2781
|
if obj.parent is not None:
|
2772
2782
|
raise NotImplementedError
|
2783
|
+
|
2773
2784
|
for cn in [obj.name, *(obj.aliases or [])]:
|
2774
|
-
|
2785
|
+
subparser = subparsers.add_parser(cn)
|
2786
|
+
|
2775
2787
|
for arg in (obj.args or []):
|
2776
2788
|
if (
|
2777
2789
|
len(arg.args) == 1 and
|
@@ -2779,29 +2791,34 @@ class ArgparseCli:
|
|
2779
2791
|
not (n := check.isinstance(arg.args[0], str)).startswith('-') and
|
2780
2792
|
'metavar' not in arg.kwargs
|
2781
2793
|
):
|
2782
|
-
|
2794
|
+
subparser.add_argument(
|
2783
2795
|
n.replace('-', '_'),
|
2784
2796
|
**arg.kwargs,
|
2785
2797
|
metavar=n,
|
2786
2798
|
)
|
2787
2799
|
else:
|
2788
|
-
|
2789
|
-
|
2800
|
+
subparser.add_argument(*arg.args, **arg.kwargs)
|
2801
|
+
|
2802
|
+
subparser.set_defaults(_cmd=obj)
|
2790
2803
|
|
2791
2804
|
elif isinstance(obj, ArgparseArg):
|
2792
2805
|
if att in anns:
|
2793
|
-
|
2794
|
-
obj.kwargs = {**
|
2806
|
+
ann_kwargs = _get_argparse_arg_ann_kwargs(anns[att])
|
2807
|
+
obj.kwargs = {**ann_kwargs, **obj.kwargs}
|
2808
|
+
|
2795
2809
|
if not obj.dest:
|
2796
2810
|
if 'dest' in obj.kwargs:
|
2797
2811
|
obj.dest = obj.kwargs['dest']
|
2798
2812
|
else:
|
2799
2813
|
obj.dest = obj.kwargs['dest'] = att # type: ignore
|
2814
|
+
|
2800
2815
|
parser.add_argument(*obj.args, **obj.kwargs)
|
2801
2816
|
|
2802
2817
|
else:
|
2803
2818
|
raise TypeError(obj)
|
2804
2819
|
|
2820
|
+
#
|
2821
|
+
|
2805
2822
|
_parser: ta.ClassVar[argparse.ArgumentParser]
|
2806
2823
|
|
2807
2824
|
@classmethod
|
@@ -2820,10 +2837,12 @@ class ArgparseCli:
|
|
2820
2837
|
def unknown_args(self) -> ta.Sequence[str]:
|
2821
2838
|
return self._unknown_args
|
2822
2839
|
|
2823
|
-
|
2824
|
-
|
2840
|
+
#
|
2841
|
+
|
2842
|
+
def _bind_cli_cmd(self, cmd: ArgparseCommand) -> ta.Callable:
|
2843
|
+
return cmd.__get__(self, type(self))
|
2825
2844
|
|
2826
|
-
def
|
2845
|
+
def prepare_cli_run(self) -> ta.Optional[ta.Callable]:
|
2827
2846
|
cmd = getattr(self.args, '_cmd', None)
|
2828
2847
|
|
2829
2848
|
if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
|
@@ -2835,12 +2854,34 @@ class ArgparseCli:
|
|
2835
2854
|
|
2836
2855
|
if cmd is None:
|
2837
2856
|
self.get_parser().print_help()
|
2857
|
+
return None
|
2858
|
+
|
2859
|
+
return self._bind_cli_cmd(cmd)
|
2860
|
+
|
2861
|
+
#
|
2862
|
+
|
2863
|
+
def cli_run(self) -> ta.Optional[int]:
|
2864
|
+
if (fn := self.prepare_cli_run()) is None:
|
2838
2865
|
return 0
|
2839
2866
|
|
2840
|
-
return
|
2867
|
+
return fn()
|
2841
2868
|
|
2842
|
-
def
|
2843
|
-
sys.exit(rc if isinstance(rc := self(), int) else 0)
|
2869
|
+
def cli_run_and_exit(self) -> ta.NoReturn:
|
2870
|
+
sys.exit(rc if isinstance(rc := self.cli_run(), int) else 0)
|
2871
|
+
|
2872
|
+
def __call__(self, *, exit: bool = False) -> ta.Optional[int]: # noqa
|
2873
|
+
if exit:
|
2874
|
+
return self.cli_run_and_exit()
|
2875
|
+
else:
|
2876
|
+
return self.cli_run()
|
2877
|
+
|
2878
|
+
#
|
2879
|
+
|
2880
|
+
async def async_cli_run(self) -> ta.Optional[int]:
|
2881
|
+
if (fn := self.prepare_cli_run()) is None:
|
2882
|
+
return 0
|
2883
|
+
|
2884
|
+
return await fn()
|
2844
2885
|
|
2845
2886
|
|
2846
2887
|
########################################
|
@@ -6975,7 +7016,7 @@ def main_bootstrap(bs: MainBootstrap) -> Injector:
|
|
6975
7016
|
|
6976
7017
|
class MainCli(ArgparseCli):
|
6977
7018
|
@argparse_command(
|
6978
|
-
argparse_arg('--
|
7019
|
+
argparse_arg('--_payload-file'),
|
6979
7020
|
|
6980
7021
|
argparse_arg('-s', '--shell'),
|
6981
7022
|
argparse_arg('-q', '--shell-quote', action='store_true'),
|
@@ -6993,10 +7034,7 @@ class MainCli(ArgparseCli):
|
|
6993
7034
|
|
6994
7035
|
argparse_arg('command', nargs='+'),
|
6995
7036
|
)
|
6996
|
-
def run(self) -> None:
|
6997
|
-
asyncio.run(self._async_run())
|
6998
|
-
|
6999
|
-
async def _async_run(self) -> None:
|
7037
|
+
async def run(self) -> None:
|
7000
7038
|
bs = MainBootstrap(
|
7001
7039
|
main_config=MainConfig(
|
7002
7040
|
log_level='DEBUG' if self.args.debug else 'INFO',
|
@@ -7005,7 +7043,7 @@ class MainCli(ArgparseCli):
|
|
7005
7043
|
),
|
7006
7044
|
|
7007
7045
|
remote_config=RemoteConfig(
|
7008
|
-
payload_file=self.args.
|
7046
|
+
payload_file=self.args._payload_file, # noqa
|
7009
7047
|
|
7010
7048
|
pycharm_remote_debug=PycharmRemoteDebug(
|
7011
7049
|
port=self.args.pycharm_debug_port,
|
@@ -7068,7 +7106,7 @@ class MainCli(ArgparseCli):
|
|
7068
7106
|
|
7069
7107
|
|
7070
7108
|
def _main() -> None:
|
7071
|
-
MainCli().
|
7109
|
+
sys.exit(asyncio.run(MainCli().async_cli_run()))
|
7072
7110
|
|
7073
7111
|
|
7074
7112
|
if __name__ == '__main__':
|
ominfra/scripts/supervisor.py
CHANGED
@@ -107,7 +107,7 @@ CallableT = ta.TypeVar('CallableT', bound=ta.Callable)
|
|
107
107
|
# ../../omlish/lite/check.py
|
108
108
|
SizedT = ta.TypeVar('SizedT', bound=ta.Sized)
|
109
109
|
CheckMessage = ta.Union[str, ta.Callable[..., ta.Optional[str]], None] # ta.TypeAlias
|
110
|
-
CheckLateConfigureFn = ta.Callable[['Checks'], None]
|
110
|
+
CheckLateConfigureFn = ta.Callable[['Checks'], None] # ta.TypeAlias
|
111
111
|
CheckOnRaiseFn = ta.Callable[[Exception], None] # ta.TypeAlias
|
112
112
|
CheckExceptionFactory = ta.Callable[..., Exception] # ta.TypeAlias
|
113
113
|
CheckArgsRenderer = ta.Callable[..., ta.Optional[str]] # ta.TypeAlias
|
@@ -4682,163 +4682,6 @@ class Injection:
|
|
4682
4682
|
inj = Injection
|
4683
4683
|
|
4684
4684
|
|
4685
|
-
########################################
|
4686
|
-
# ../../../omlish/lite/journald.py
|
4687
|
-
|
4688
|
-
|
4689
|
-
##
|
4690
|
-
|
4691
|
-
|
4692
|
-
class sd_iovec(ct.Structure): # noqa
|
4693
|
-
pass
|
4694
|
-
|
4695
|
-
|
4696
|
-
sd_iovec._fields_ = [
|
4697
|
-
('iov_base', ct.c_void_p), # Pointer to data.
|
4698
|
-
('iov_len', ct.c_size_t), # Length of data.
|
4699
|
-
]
|
4700
|
-
|
4701
|
-
|
4702
|
-
##
|
4703
|
-
|
4704
|
-
|
4705
|
-
@cached_nullary
|
4706
|
-
def sd_libsystemd() -> ta.Any:
|
4707
|
-
lib = ct.CDLL('libsystemd.so.0')
|
4708
|
-
|
4709
|
-
lib.sd_journal_sendv.restype = ct.c_int
|
4710
|
-
lib.sd_journal_sendv.argtypes = [ct.POINTER(sd_iovec), ct.c_int]
|
4711
|
-
|
4712
|
-
return lib
|
4713
|
-
|
4714
|
-
|
4715
|
-
@cached_nullary
|
4716
|
-
def sd_try_libsystemd() -> ta.Optional[ta.Any]:
|
4717
|
-
try:
|
4718
|
-
return sd_libsystemd()
|
4719
|
-
except OSError: # noqa
|
4720
|
-
return None
|
4721
|
-
|
4722
|
-
|
4723
|
-
##
|
4724
|
-
|
4725
|
-
|
4726
|
-
def sd_journald_send(**fields: str) -> int:
|
4727
|
-
lib = sd_libsystemd()
|
4728
|
-
|
4729
|
-
msgs = [
|
4730
|
-
f'{k.upper()}={v}\0'.encode('utf-8')
|
4731
|
-
for k, v in fields.items()
|
4732
|
-
]
|
4733
|
-
|
4734
|
-
vec = (sd_iovec * len(msgs))()
|
4735
|
-
cl = (ct.c_char_p * len(msgs))() # noqa
|
4736
|
-
for i in range(len(msgs)):
|
4737
|
-
vec[i].iov_base = ct.cast(ct.c_char_p(msgs[i]), ct.c_void_p)
|
4738
|
-
vec[i].iov_len = len(msgs[i]) - 1
|
4739
|
-
|
4740
|
-
return lib.sd_journal_sendv(vec, len(msgs))
|
4741
|
-
|
4742
|
-
|
4743
|
-
##
|
4744
|
-
|
4745
|
-
|
4746
|
-
SD_LOG_LEVEL_MAP: ta.Mapping[int, int] = {
|
4747
|
-
logging.FATAL: syslog.LOG_EMERG, # system is unusable
|
4748
|
-
# LOG_ALERT ? # action must be taken immediately
|
4749
|
-
logging.CRITICAL: syslog.LOG_CRIT,
|
4750
|
-
logging.ERROR: syslog.LOG_ERR,
|
4751
|
-
logging.WARNING: syslog.LOG_WARNING,
|
4752
|
-
# LOG_NOTICE ? # normal but significant condition
|
4753
|
-
logging.INFO: syslog.LOG_INFO,
|
4754
|
-
logging.DEBUG: syslog.LOG_DEBUG,
|
4755
|
-
}
|
4756
|
-
|
4757
|
-
|
4758
|
-
class JournaldLogHandler(logging.Handler):
|
4759
|
-
"""
|
4760
|
-
TODO:
|
4761
|
-
- fallback handler for when this barfs
|
4762
|
-
"""
|
4763
|
-
|
4764
|
-
def __init__(
|
4765
|
-
self,
|
4766
|
-
*,
|
4767
|
-
use_formatter_output: bool = False,
|
4768
|
-
) -> None:
|
4769
|
-
super().__init__()
|
4770
|
-
|
4771
|
-
sd_libsystemd()
|
4772
|
-
|
4773
|
-
self._use_formatter_output = use_formatter_output
|
4774
|
-
|
4775
|
-
#
|
4776
|
-
|
4777
|
-
EXTRA_RECORD_ATTRS_BY_JOURNALD_FIELD: ta.ClassVar[ta.Mapping[str, str]] = {
|
4778
|
-
'name': 'name',
|
4779
|
-
'module': 'module',
|
4780
|
-
'exception': 'exc_text',
|
4781
|
-
'thread_name': 'threadName',
|
4782
|
-
'task_name': 'taskName',
|
4783
|
-
}
|
4784
|
-
|
4785
|
-
def make_fields(self, record: logging.LogRecord) -> ta.Mapping[str, str]:
|
4786
|
-
formatter_message = self.format(record)
|
4787
|
-
if self._use_formatter_output:
|
4788
|
-
message = formatter_message
|
4789
|
-
else:
|
4790
|
-
message = record.message
|
4791
|
-
|
4792
|
-
fields: dict[str, str] = {
|
4793
|
-
'message': message,
|
4794
|
-
'priority': str(SD_LOG_LEVEL_MAP[record.levelno]),
|
4795
|
-
'tid': str(threading.get_ident()),
|
4796
|
-
}
|
4797
|
-
|
4798
|
-
if (pathname := record.pathname) is not None:
|
4799
|
-
fields['code_file'] = pathname
|
4800
|
-
if (lineno := record.lineno) is not None:
|
4801
|
-
fields['code_lineno'] = str(lineno)
|
4802
|
-
if (func_name := record.funcName) is not None:
|
4803
|
-
fields['code_func'] = func_name
|
4804
|
-
|
4805
|
-
for f, a in self.EXTRA_RECORD_ATTRS_BY_JOURNALD_FIELD.items():
|
4806
|
-
if (v := getattr(record, a, None)) is not None:
|
4807
|
-
fields[f] = str(v)
|
4808
|
-
|
4809
|
-
return fields
|
4810
|
-
|
4811
|
-
#
|
4812
|
-
|
4813
|
-
def emit(self, record: logging.LogRecord) -> None:
|
4814
|
-
try:
|
4815
|
-
fields = self.make_fields(record)
|
4816
|
-
|
4817
|
-
if rc := sd_journald_send(**fields):
|
4818
|
-
raise RuntimeError(f'{self.__class__.__name__}.emit failed: {rc=}') # noqa
|
4819
|
-
|
4820
|
-
except RecursionError: # See issue 36272
|
4821
|
-
raise
|
4822
|
-
|
4823
|
-
except Exception: # noqa
|
4824
|
-
self.handleError(record)
|
4825
|
-
|
4826
|
-
|
4827
|
-
def journald_log_handler_factory(
|
4828
|
-
*,
|
4829
|
-
no_tty_check: bool = False,
|
4830
|
-
no_fallback: bool = False,
|
4831
|
-
) -> logging.Handler:
|
4832
|
-
if (
|
4833
|
-
sys.platform == 'linux' and
|
4834
|
-
(no_tty_check or not sys.stderr.isatty()) and
|
4835
|
-
(no_fallback or sd_try_libsystemd() is not None)
|
4836
|
-
):
|
4837
|
-
return JournaldLogHandler()
|
4838
|
-
|
4839
|
-
return logging.StreamHandler()
|
4840
|
-
|
4841
|
-
|
4842
4685
|
########################################
|
4843
4686
|
# ../../../omlish/lite/logs.py
|
4844
4687
|
"""
|
@@ -5565,6 +5408,163 @@ def check_runtime_version() -> None:
|
|
5565
5408
|
raise OSError(f'Requires python {REQUIRED_PYTHON_VERSION}, got {sys.version_info} from {sys.executable}') # noqa
|
5566
5409
|
|
5567
5410
|
|
5411
|
+
########################################
|
5412
|
+
# ../../../omlish/os/journald.py
|
5413
|
+
|
5414
|
+
|
5415
|
+
##
|
5416
|
+
|
5417
|
+
|
5418
|
+
class sd_iovec(ct.Structure): # noqa
|
5419
|
+
pass
|
5420
|
+
|
5421
|
+
|
5422
|
+
sd_iovec._fields_ = [
|
5423
|
+
('iov_base', ct.c_void_p), # Pointer to data.
|
5424
|
+
('iov_len', ct.c_size_t), # Length of data.
|
5425
|
+
]
|
5426
|
+
|
5427
|
+
|
5428
|
+
##
|
5429
|
+
|
5430
|
+
|
5431
|
+
@cached_nullary
|
5432
|
+
def sd_libsystemd() -> ta.Any:
|
5433
|
+
lib = ct.CDLL('libsystemd.so.0')
|
5434
|
+
|
5435
|
+
lib.sd_journal_sendv.restype = ct.c_int
|
5436
|
+
lib.sd_journal_sendv.argtypes = [ct.POINTER(sd_iovec), ct.c_int]
|
5437
|
+
|
5438
|
+
return lib
|
5439
|
+
|
5440
|
+
|
5441
|
+
@cached_nullary
|
5442
|
+
def sd_try_libsystemd() -> ta.Optional[ta.Any]:
|
5443
|
+
try:
|
5444
|
+
return sd_libsystemd()
|
5445
|
+
except OSError: # noqa
|
5446
|
+
return None
|
5447
|
+
|
5448
|
+
|
5449
|
+
##
|
5450
|
+
|
5451
|
+
|
5452
|
+
def sd_journald_send(**fields: str) -> int:
|
5453
|
+
lib = sd_libsystemd()
|
5454
|
+
|
5455
|
+
msgs = [
|
5456
|
+
f'{k.upper()}={v}\0'.encode('utf-8')
|
5457
|
+
for k, v in fields.items()
|
5458
|
+
]
|
5459
|
+
|
5460
|
+
vec = (sd_iovec * len(msgs))()
|
5461
|
+
cl = (ct.c_char_p * len(msgs))() # noqa
|
5462
|
+
for i in range(len(msgs)):
|
5463
|
+
vec[i].iov_base = ct.cast(ct.c_char_p(msgs[i]), ct.c_void_p)
|
5464
|
+
vec[i].iov_len = len(msgs[i]) - 1
|
5465
|
+
|
5466
|
+
return lib.sd_journal_sendv(vec, len(msgs))
|
5467
|
+
|
5468
|
+
|
5469
|
+
##
|
5470
|
+
|
5471
|
+
|
5472
|
+
SD_LOG_LEVEL_MAP: ta.Mapping[int, int] = {
|
5473
|
+
logging.FATAL: syslog.LOG_EMERG, # system is unusable
|
5474
|
+
# LOG_ALERT ? # action must be taken immediately
|
5475
|
+
logging.CRITICAL: syslog.LOG_CRIT,
|
5476
|
+
logging.ERROR: syslog.LOG_ERR,
|
5477
|
+
logging.WARNING: syslog.LOG_WARNING,
|
5478
|
+
# LOG_NOTICE ? # normal but significant condition
|
5479
|
+
logging.INFO: syslog.LOG_INFO,
|
5480
|
+
logging.DEBUG: syslog.LOG_DEBUG,
|
5481
|
+
}
|
5482
|
+
|
5483
|
+
|
5484
|
+
class JournaldLogHandler(logging.Handler):
|
5485
|
+
"""
|
5486
|
+
TODO:
|
5487
|
+
- fallback handler for when this barfs
|
5488
|
+
"""
|
5489
|
+
|
5490
|
+
def __init__(
|
5491
|
+
self,
|
5492
|
+
*,
|
5493
|
+
use_formatter_output: bool = False,
|
5494
|
+
) -> None:
|
5495
|
+
super().__init__()
|
5496
|
+
|
5497
|
+
sd_libsystemd()
|
5498
|
+
|
5499
|
+
self._use_formatter_output = use_formatter_output
|
5500
|
+
|
5501
|
+
#
|
5502
|
+
|
5503
|
+
EXTRA_RECORD_ATTRS_BY_JOURNALD_FIELD: ta.ClassVar[ta.Mapping[str, str]] = {
|
5504
|
+
'name': 'name',
|
5505
|
+
'module': 'module',
|
5506
|
+
'exception': 'exc_text',
|
5507
|
+
'thread_name': 'threadName',
|
5508
|
+
'task_name': 'taskName',
|
5509
|
+
}
|
5510
|
+
|
5511
|
+
def make_fields(self, record: logging.LogRecord) -> ta.Mapping[str, str]:
|
5512
|
+
formatter_message = self.format(record)
|
5513
|
+
if self._use_formatter_output:
|
5514
|
+
message = formatter_message
|
5515
|
+
else:
|
5516
|
+
message = record.message
|
5517
|
+
|
5518
|
+
fields: dict[str, str] = {
|
5519
|
+
'message': message,
|
5520
|
+
'priority': str(SD_LOG_LEVEL_MAP[record.levelno]),
|
5521
|
+
'tid': str(threading.get_ident()),
|
5522
|
+
}
|
5523
|
+
|
5524
|
+
if (pathname := record.pathname) is not None:
|
5525
|
+
fields['code_file'] = pathname
|
5526
|
+
if (lineno := record.lineno) is not None:
|
5527
|
+
fields['code_lineno'] = str(lineno)
|
5528
|
+
if (func_name := record.funcName) is not None:
|
5529
|
+
fields['code_func'] = func_name
|
5530
|
+
|
5531
|
+
for f, a in self.EXTRA_RECORD_ATTRS_BY_JOURNALD_FIELD.items():
|
5532
|
+
if (v := getattr(record, a, None)) is not None:
|
5533
|
+
fields[f] = str(v)
|
5534
|
+
|
5535
|
+
return fields
|
5536
|
+
|
5537
|
+
#
|
5538
|
+
|
5539
|
+
def emit(self, record: logging.LogRecord) -> None:
|
5540
|
+
try:
|
5541
|
+
fields = self.make_fields(record)
|
5542
|
+
|
5543
|
+
if rc := sd_journald_send(**fields):
|
5544
|
+
raise RuntimeError(f'{self.__class__.__name__}.emit failed: {rc=}') # noqa
|
5545
|
+
|
5546
|
+
except RecursionError: # See issue 36272
|
5547
|
+
raise
|
5548
|
+
|
5549
|
+
except Exception: # noqa
|
5550
|
+
self.handleError(record)
|
5551
|
+
|
5552
|
+
|
5553
|
+
def journald_log_handler_factory(
|
5554
|
+
*,
|
5555
|
+
no_tty_check: bool = False,
|
5556
|
+
no_fallback: bool = False,
|
5557
|
+
) -> logging.Handler:
|
5558
|
+
if (
|
5559
|
+
sys.platform == 'linux' and
|
5560
|
+
(no_tty_check or not sys.stderr.isatty()) and
|
5561
|
+
(no_fallback or sd_try_libsystemd() is not None)
|
5562
|
+
):
|
5563
|
+
return JournaldLogHandler()
|
5564
|
+
|
5565
|
+
return logging.StreamHandler()
|
5566
|
+
|
5567
|
+
|
5568
5568
|
########################################
|
5569
5569
|
# ../../configs.py
|
5570
5570
|
|
ominfra/supervisor/main.py
CHANGED
@@ -36,9 +36,9 @@ import typing as ta
|
|
36
36
|
|
37
37
|
from omlish.http.coroserver import CoroHttpServer
|
38
38
|
from omlish.lite.inject import inj
|
39
|
-
from omlish.lite.journald import journald_log_handler_factory
|
40
39
|
from omlish.lite.logs import configure_standard_logging
|
41
40
|
from omlish.lite.runtime import is_debugger_attached
|
41
|
+
from omlish.os.journald import journald_log_handler_factory
|
42
42
|
|
43
43
|
from ..configs import read_config_file
|
44
44
|
from .configs import ServerConfig
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ominfra
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev152
|
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.dev152
|
16
|
+
Requires-Dist: omlish==0.0.0.dev152
|
17
17
|
Provides-Extra: all
|
18
18
|
Requires-Dist: paramiko~=3.5; extra == "all"
|
19
19
|
Requires-Dist: asyncssh~=2.18; extra == "all"
|
@@ -17,7 +17,7 @@ ominfra/clouds/aws/metadata.py,sha256=XR1BuMdQheyeFjjA3MN8GCNWVAp5ahoPdbWXEmViut
|
|
17
17
|
ominfra/clouds/aws/journald2aws/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
18
18
|
ominfra/clouds/aws/journald2aws/__main__.py,sha256=d23loR_cKfTYZwYiqpt_CmKI7dd5WcYFgIYzqMep75E,68
|
19
19
|
ominfra/clouds/aws/journald2aws/cursor.py,sha256=tQ7O6BHlEdaalbiI_Rqagj0aHfdtTQ_ZJwdOSRUjNvQ,1173
|
20
|
-
ominfra/clouds/aws/journald2aws/driver.py,sha256=
|
20
|
+
ominfra/clouds/aws/journald2aws/driver.py,sha256=b3XfSlIBWAWJLImmyh1ZK9FpdNAYNZ2YZeCv_Q9GckM,6111
|
21
21
|
ominfra/clouds/aws/journald2aws/main.py,sha256=RQJhk4aPtnp4EHzC-ST1Rs9BN6D7bqQQVjCRxGU7JuQ,2147
|
22
22
|
ominfra/clouds/aws/journald2aws/poster.py,sha256=hz1XuctW8GtLmfjhRvCFY6py52D4BzXHYny5XKFpHSA,2833
|
23
23
|
ominfra/clouds/gcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -33,7 +33,7 @@ ominfra/manage/bootstrap.py,sha256=puGpmK6b6ZCAX5E_HI9ucUuWlXB4U_4Xwc2x8GAKSVo,2
|
|
33
33
|
ominfra/manage/bootstrap_.py,sha256=WVry3P5ViPpdEC_-EFBouZTECMxs4CwRbek4Oz_iRbc,517
|
34
34
|
ominfra/manage/config.py,sha256=1y2N_8nXHBZc6YbW6BaRZoDDCTBmiHuWtTOQ7zdr5VE,184
|
35
35
|
ominfra/manage/inject.py,sha256=jGjGqlecpxzpJR3-RqQhEBOmpsix5UwSsvrz5DbayC4,1395
|
36
|
-
ominfra/manage/main.py,sha256=
|
36
|
+
ominfra/manage/main.py,sha256=XtQNtFqTlm2hM225qBuhpri_B0Aeo1dezQhMJwfjotc,3860
|
37
37
|
ominfra/manage/marshal.py,sha256=WKj7IU9bo4fBMSSzT6ZMm_WFalXIJZ-V7j8oi92fNhk,305
|
38
38
|
ominfra/manage/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
39
39
|
ominfra/manage/commands/base.py,sha256=LtaI0AgnplttQK7gNncNItq8yuTZQimJTaprVpZktI8,3993
|
@@ -47,7 +47,7 @@ ominfra/manage/deploy/command.py,sha256=CBzsw31u86wxkY9Ms-Es70ijD_3naZLAcj3Gb6Of
|
|
47
47
|
ominfra/manage/deploy/inject.py,sha256=j5LYK5y_nZgdaNLde8sV2w_---GvmibgO_ZBT8qzeFM,499
|
48
48
|
ominfra/manage/deploy/paths.py,sha256=Ad7OGERMqGUWO-0os1PXSO3sh9uGqrxxlEyT_3fYkac,3703
|
49
49
|
ominfra/manage/remote/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
50
|
-
ominfra/manage/remote/_main.py,sha256=
|
50
|
+
ominfra/manage/remote/_main.py,sha256=7grHKEE72a6IHijwLV3uWbqnrl_v27ZNJSI3WWwGs7o,4356
|
51
51
|
ominfra/manage/remote/channel.py,sha256=36xR9Ti9ZA8TUBtxmY0u7_3Lv7E6wzQTxlZl7gLR5GE,2224
|
52
52
|
ominfra/manage/remote/config.py,sha256=zRIC7Yhh3FMfoIgyqlbDTwpL_jS23lhQXjGB2_YG4Eg,473
|
53
53
|
ominfra/manage/remote/connection.py,sha256=5h-JrMK07Ulqgol3ZXmcTpSUr6iMu1oZd-wCjnRqe_Y,2821
|
@@ -56,9 +56,9 @@ ominfra/manage/remote/inject.py,sha256=euI9YmLTmNw7tdkQq_5PtFg6n9pYz3mGukOOApdYw
|
|
56
56
|
ominfra/manage/remote/payload.py,sha256=Rn-Yo26POpHEOOfUHX3jWkqcQVEAvkJ_5Bu13jwoob4,944
|
57
57
|
ominfra/manage/remote/spawning.py,sha256=bL87ted_lLwLW6DhrYPaXLRaIq7f6VYg_u2LJoMEpoE,3205
|
58
58
|
ominfra/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
59
|
-
ominfra/scripts/journald2aws.py,sha256=
|
60
|
-
ominfra/scripts/manage.py,sha256=
|
61
|
-
ominfra/scripts/supervisor.py,sha256=
|
59
|
+
ominfra/scripts/journald2aws.py,sha256=jLXI4iuMN1uRtRgCeyyczjwRl1pxKEgfbz1q8CJoUjc,149453
|
60
|
+
ominfra/scripts/manage.py,sha256=17S7oz99WAEb9GRguohf6uEofd5WdcYhvM1ulgOmU6w,195440
|
61
|
+
ominfra/scripts/supervisor.py,sha256=uPzXIfstv1J-LhDCKLx70RMUBQVA0zMkd7h4X18SAzQ,262206
|
62
62
|
ominfra/supervisor/LICENSE.txt,sha256=yvqaMNsDhWxziHa9ien6qCW1SkZv-DQlAg96XjfSee8,1746
|
63
63
|
ominfra/supervisor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
64
64
|
ominfra/supervisor/__main__.py,sha256=I0yFw-C08OOiZ3BF6lF1Oiv789EQXu-_j6whDhQUTEA,66
|
@@ -72,7 +72,7 @@ ominfra/supervisor/groupsimpl.py,sha256=PCDyc_Wc-pnvIj56_aEyiA5exCpK6n9iErqnJzO2
|
|
72
72
|
ominfra/supervisor/http.py,sha256=hysC2uFm5wWqi_MmOs1NrQ_UdwiXOawKEV-B37fwA-A,3445
|
73
73
|
ominfra/supervisor/inject.py,sha256=6nBEnpE8VLjtYK12z5DGRP7WzgbwLAz5yf__1KnJl6g,4693
|
74
74
|
ominfra/supervisor/io.py,sha256=moaGNaPuYXEAUzLg8Qjo05DEIcOUNYUj8SSr8eT0d24,3198
|
75
|
-
ominfra/supervisor/main.py,sha256=
|
75
|
+
ominfra/supervisor/main.py,sha256=Pad43J0c6jvWGJqn3BAtIubD6MYuj261z-AgTuchvAs,4246
|
76
76
|
ominfra/supervisor/pipes.py,sha256=2ZihNTnRNjnIPOtPbm3_pyqO15f7BNs7WnNtO5V8ahM,2231
|
77
77
|
ominfra/supervisor/privileges.py,sha256=kaRTHI7XjqzxEWCeHp3_0J0Vc4gSPugRbXEwxuw6MYE,2054
|
78
78
|
ominfra/supervisor/process.py,sha256=UaubVxsxVqDnbuWVpTH0DTGbJGLO0vGJ9mNcvy2kCXM,217
|
@@ -100,9 +100,9 @@ ominfra/tailscale/api.py,sha256=C5-t_b6jZXUWcy5k8bXm7CFnk73pSdrlMOgGDeGVrpw,1370
|
|
100
100
|
ominfra/tailscale/cli.py,sha256=h6akQJMl0KuWLHS7Ur6WcBZ2JwF0DJQhsPTnFBdGyNk,3571
|
101
101
|
ominfra/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
102
102
|
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.
|
103
|
+
ominfra-0.0.0.dev152.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
104
|
+
ominfra-0.0.0.dev152.dist-info/METADATA,sha256=j1IeXSSy10gAqMN5hUB8Ab2oEDKYcYQyKEgvFkSnv3s,731
|
105
|
+
ominfra-0.0.0.dev152.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
106
|
+
ominfra-0.0.0.dev152.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
|
107
|
+
ominfra-0.0.0.dev152.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
|
108
|
+
ominfra-0.0.0.dev152.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|