ominfra 0.0.0.dev122__py3-none-any.whl → 0.0.0.dev123__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.
@@ -1,16 +1,20 @@
1
1
  # ruff: noqa: UP006 UP007
2
2
  import errno
3
3
  import os
4
- import signal
5
4
  import sys
6
5
  import tempfile
7
6
  import types
8
7
  import typing as ta
9
8
 
9
+ from .signals import sig_name
10
+
10
11
 
11
12
  T = ta.TypeVar('T')
12
13
 
13
14
 
15
+ ##
16
+
17
+
14
18
  def as_bytes(s: ta.Union[str, bytes], encoding: str = 'utf8') -> bytes:
15
19
  if isinstance(s, bytes):
16
20
  return s
@@ -18,13 +22,23 @@ def as_bytes(s: ta.Union[str, bytes], encoding: str = 'utf8') -> bytes:
18
22
  return s.encode(encoding)
19
23
 
20
24
 
21
- def as_string(s: ta.Union[str, bytes], encoding='utf8') -> str:
25
+ def as_string(s: ta.Union[str, bytes], encoding: str = 'utf8') -> str:
22
26
  if isinstance(s, str):
23
27
  return s
24
28
  else:
25
29
  return s.decode(encoding)
26
30
 
27
31
 
32
+ def find_prefix_at_end(haystack: bytes, needle: bytes) -> int:
33
+ l = len(needle) - 1
34
+ while l and not haystack.endswith(needle[:l]):
35
+ l -= 1
36
+ return l
37
+
38
+
39
+ ##
40
+
41
+
28
42
  def compact_traceback() -> ta.Tuple[
29
43
  ta.Tuple[str, str, int],
30
44
  ta.Type[BaseException],
@@ -52,17 +66,14 @@ def compact_traceback() -> ta.Tuple[
52
66
  return (file, function, line), t, v, info # type: ignore
53
67
 
54
68
 
55
- def find_prefix_at_end(haystack: bytes, needle: bytes) -> int:
56
- l = len(needle) - 1
57
- while l and not haystack.endswith(needle[:l]):
58
- l -= 1
59
- return l
60
-
61
-
62
69
  class ExitNow(Exception): # noqa
63
70
  pass
64
71
 
65
72
 
73
+ def real_exit(code: int) -> None:
74
+ os._exit(code) # noqa
75
+
76
+
66
77
  ##
67
78
 
68
79
 
@@ -80,7 +91,7 @@ def decode_wait_status(sts: int) -> ta.Tuple[int, str]:
80
91
  return es, msg
81
92
  elif os.WIFSIGNALED(sts):
82
93
  sig = os.WTERMSIG(sts)
83
- msg = f'terminated by {signame(sig)}'
94
+ msg = f'terminated by {sig_name(sig)}'
84
95
  if hasattr(os, 'WCOREDUMP'):
85
96
  iscore = os.WCOREDUMP(sts)
86
97
  else:
@@ -93,49 +104,10 @@ def decode_wait_status(sts: int) -> ta.Tuple[int, str]:
93
104
  return -1, msg
94
105
 
95
106
 
96
- _signames: ta.Optional[ta.Mapping[int, str]] = None
97
-
98
-
99
- def signame(sig: int) -> str:
100
- global _signames
101
- if _signames is None:
102
- _signames = _init_signames()
103
- return _signames.get(sig) or 'signal %d' % sig
104
-
105
-
106
- def _init_signames() -> ta.Dict[int, str]:
107
- d = {}
108
- for k, v in signal.__dict__.items():
109
- k_startswith = getattr(k, 'startswith', None)
110
- if k_startswith is None:
111
- continue
112
- if k_startswith('SIG') and not k_startswith('SIG_'):
113
- d[v] = k
114
- return d
115
-
116
-
117
- class SignalReceiver:
118
- def __init__(self) -> None:
119
- super().__init__()
120
- self._signals_recvd: ta.List[int] = []
121
-
122
- def receive(self, sig: int, frame: ta.Any) -> None:
123
- if sig not in self._signals_recvd:
124
- self._signals_recvd.append(sig)
125
-
126
- def install(self, *sigs: int) -> None:
127
- for sig in sigs:
128
- signal.signal(sig, self.receive)
129
-
130
- def get_signal(self) -> ta.Optional[int]:
131
- if self._signals_recvd:
132
- sig = self._signals_recvd.pop(0)
133
- else:
134
- sig = None
135
- return sig
107
+ ##
136
108
 
137
109
 
138
- def readfd(fd: int) -> bytes:
110
+ def read_fd(fd: int) -> bytes:
139
111
  try:
140
112
  data = os.read(fd, 2 << 16) # 128K
141
113
  except OSError as why:
@@ -180,8 +152,7 @@ def mktempfile(suffix: str, prefix: str, dir: str) -> str: # noqa
180
152
  return filename
181
153
 
182
154
 
183
- def real_exit(code: int) -> None:
184
- os._exit(code) # noqa
155
+ ##
185
156
 
186
157
 
187
158
  def get_path() -> ta.Sequence[str]:
@@ -199,6 +170,9 @@ def normalize_path(v: str) -> str:
199
170
  return os.path.normpath(os.path.abspath(os.path.expanduser(v)))
200
171
 
201
172
 
173
+ ##
174
+
175
+
202
176
  ANSI_ESCAPE_BEGIN = b'\x1b['
203
177
  ANSI_TERMINATORS = (b'H', b'f', b'A', b'B', b'C', b'D', b'R', b's', b'u', b'J', b'K', b'h', b'l', b'p', b'm')
204
178
 
@@ -223,3 +197,10 @@ def strip_escapes(s: bytes) -> bytes:
223
197
  show = 0
224
198
  i += 1
225
199
  return result
200
+
201
+
202
+ ##
203
+
204
+
205
+ def timeslice(period: int, when: float) -> int:
206
+ return int(when - (when % period))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ominfra
3
- Version: 0.0.0.dev122
3
+ Version: 0.0.0.dev123
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.dev122
16
- Requires-Dist: omlish ==0.0.0.dev122
15
+ Requires-Dist: omdev ==0.0.0.dev123
16
+ Requires-Dist: omlish ==0.0.0.dev123
17
17
  Provides-Extra: all
18
18
  Requires-Dist: paramiko ~=3.5 ; extra == 'all'
19
19
  Requires-Dist: asyncssh ~=2.18 ; extra == 'all'
@@ -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=46QRoTcnPzhu7RvIL9m7zfx4_AwysA4XdZ1LvABCcHA,34589
25
+ ominfra/deploy/_executor.py,sha256=q5XLH1nnj23QrM_5SFHqcBABfprfR7JpfBCsP4KixKw,34594
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
@@ -51,40 +51,42 @@ ominfra/deploy/poly/venv.py,sha256=BoipDEa4NTeodjf3L57KJfq9eGKLagFNKwD8pS4yrzA,1
51
51
  ominfra/journald/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  ominfra/journald/fields.py,sha256=NjjVn7GW4jkcGdyiiizVjEfQqSFnolXYk3kDcSQcMmc,12278
53
53
  ominfra/journald/genmessages.py,sha256=rLTS-K2v7otNOtTz4RoOEVYCm0fQuuBzf47e0T61tA8,1857
54
- ominfra/journald/messages.py,sha256=2iMY4k63XGNcN3LPvBmmK55ftjupnNh8f_ijlW9mkhQ,2208
54
+ ominfra/journald/messages.py,sha256=Wr7TjWMOySc0WnKwp_-idR8RfeKlbyJQ_KkELr0VB70,2192
55
55
  ominfra/journald/tailer.py,sha256=5abcFMfgi7fnY9ZEQe2ZVobaJxjQkeu6d9Kagw33a1w,33525
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=SGMQpN5-LDM99yNYR7lvjdkkJ_jVinSfmxm9mU34hjc,28425
59
+ ominfra/pyremote/_runcommands.py,sha256=zlNvob9gaUdwG2UJkra5sz0PpxJcQvaidah43ySKfys,28430
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=G56Fx-fHv3p2brOObTwdX7ORA2blhslFfooG2LQL6h4,128491
64
- ominfra/scripts/supervisor.py,sha256=Vv4x7BER3xAZ-ORNM-5SB1HsSJvu-eSYfcgx3kx5Vfo,173118
63
+ ominfra/scripts/journald2aws.py,sha256=1bP8b-k9Z-so4Yk0AY6GZkheknO2Wdtf3V_6Y3M2bbk,128480
64
+ ominfra/scripts/supervisor.py,sha256=2AcNVdw7e68TcNrl4R9XeFtJFr_x3mPxNsI0UFoBVB8,174176
65
65
  ominfra/supervisor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
66
66
  ominfra/supervisor/__main__.py,sha256=I0yFw-C08OOiZ3BF6lF1Oiv789EQXu-_j6whDhQUTEA,66
67
- ominfra/supervisor/compat.py,sha256=mutfnQbSCDaE7TSuQArOcFdfGVw4uEE_E04rIhs1IqU,5312
68
67
  ominfra/supervisor/configs.py,sha256=TtVyWdxinrd3tueM6q8j2YVcEqauFTJqlbykkSjByEo,3524
69
- ominfra/supervisor/context.py,sha256=Ss4xqnLe8LafIcg10oSr8KyqAJZxjofgNDB_pVoyBA8,16164
68
+ ominfra/supervisor/context.py,sha256=m0TWdMMG8VOHQg2CMLYIuX2HeR0zdEDjlLiBAH_kH5U,15294
70
69
  ominfra/supervisor/datatypes.py,sha256=UnXO_UlCyJD9u0uvea1wvnk_UZCzxNMeFvPK83gv530,4432
71
- ominfra/supervisor/dispatchers.py,sha256=sJ61yTo9EEbxHwe2NbzOTAFFFCuuyIhYli_xJioQBoo,10423
72
- ominfra/supervisor/events.py,sha256=IhdL7Fj-hEvTvZ5WF6aIa2YjSPQhuUoasoJSMmRLQkU,7650
70
+ ominfra/supervisor/dispatchers.py,sha256=rpcYYGb2CkCgmPMrxeN-jTxr-PZffZ1OA9lQr4FfV34,11011
71
+ ominfra/supervisor/events.py,sha256=01pet30KrzS4LszeKy0JUCMhMO8_OwuxvvDjfI_eGQQ,6593
73
72
  ominfra/supervisor/exceptions.py,sha256=Qbu211H3CLlSmi9LsSikOwrcL5HgJP9ugvcKWlGTAoI,750
74
- ominfra/supervisor/main.py,sha256=v3Ezr7ECzqYX33HmhWbZrh78-h-1OnnxqPqmjS4zkFw,4000
75
- ominfra/supervisor/poller.py,sha256=VCBxLItfA4Vj69jet2XFbFScPbmdD9JA1evaofk_AnY,7709
76
- ominfra/supervisor/process.py,sha256=oEd58g6KcLNWhwaZBu8wZJjb6Vd0t1sKPMVE4BjbBSI,32270
77
- ominfra/supervisor/states.py,sha256=JMxXYTZhJkMNQZ2tTV6wId7wrvnWgiZteskACprKskM,1374
78
- ominfra/supervisor/supervisor.py,sha256=7T7RAtGc9qsb0s9fBiimReVyaWknl1e3rGU9nNxjll8,13002
79
- ominfra/supervisor/types.py,sha256=GhVixieeJ00fWclxPLM2oMugCe9wEjW44wJzQ2AO0V0,1264
73
+ ominfra/supervisor/groups.py,sha256=VgFHgDwtCFumM8Qr5kbQ6e4xoau6tBQuW4lrKox_Z9o,4610
74
+ ominfra/supervisor/main.py,sha256=fxPKeJuPT-fqcGaADZct0HTd_Ovje03vEMovsL9wtCc,4570
75
+ ominfra/supervisor/poller.py,sha256=-gY_GIjuYr0J6ql_tFwKhlzRN4_mQaiVgMDOEHx_54Y,7693
76
+ ominfra/supervisor/process.py,sha256=dpVG7eX8q9nsIA0uH7KrJwdZGbhtw6ZAXWG8LsMpWnY,28306
77
+ ominfra/supervisor/signals.py,sha256=tv1CJm3Xrb69KVSswqm_u2vr2Lb2AbTxBVtQqIOSeyk,1176
78
+ ominfra/supervisor/states.py,sha256=9yoNOSwalRcKEnCP9zG6tVS0oivo5tCeuH6AaaW7Jpc,890
79
+ ominfra/supervisor/supervisor.py,sha256=7A4qVIaD6yf6nfcFU9NkKZTbZoxGXRK7pmq7cML6PMU,13105
80
+ ominfra/supervisor/types.py,sha256=GhBNQiB4oU-ruCoDZm10omUJB1fC0Tg3xYT_E_ta_Wk,2623
81
+ ominfra/supervisor/utils.py,sha256=jlUy5WaCIG7YqOLRoV_9aU5i26K0Cn7ID4_Mj-Y0Z2w,4368
80
82
  ominfra/tailscale/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
83
  ominfra/tailscale/api.py,sha256=C5-t_b6jZXUWcy5k8bXm7CFnk73pSdrlMOgGDeGVrpw,1370
82
84
  ominfra/tailscale/cli.py,sha256=DSGp4hn5xwOW-l_u_InKlSF6kIobxtUtVssf_73STs0,3567
83
85
  ominfra/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
86
  ominfra/tools/listresources.py,sha256=4qVg5txsb10EHhvqXXeM6gJ2jx9LbroEnPydDv1uXs0,6176
85
- ominfra-0.0.0.dev122.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
86
- ominfra-0.0.0.dev122.dist-info/METADATA,sha256=deSke0MO3j-CHNhTN8uGgI-3374_P5fgfqJgo4GRVMU,742
87
- ominfra-0.0.0.dev122.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
88
- ominfra-0.0.0.dev122.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
89
- ominfra-0.0.0.dev122.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
90
- ominfra-0.0.0.dev122.dist-info/RECORD,,
87
+ ominfra-0.0.0.dev123.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
88
+ ominfra-0.0.0.dev123.dist-info/METADATA,sha256=0WOejBCOaFJ0T1GfM0nHTQ2EgEu8qWIdPjJsxLBMATA,742
89
+ ominfra-0.0.0.dev123.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
90
+ ominfra-0.0.0.dev123.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
91
+ ominfra-0.0.0.dev123.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
92
+ ominfra-0.0.0.dev123.dist-info/RECORD,,