ominfra 0.0.0.dev58__tar.gz → 0.0.0.dev60__tar.gz
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-0.0.0.dev58/ominfra.egg-info → ominfra-0.0.0.dev60}/PKG-INFO +3 -3
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/.manifests.json +12 -0
- ominfra-0.0.0.dev60/ominfra/clouds/aws/__main__.py +11 -0
- ominfra-0.0.0.dev60/ominfra/clouds/aws/cli.py +25 -0
- ominfra-0.0.0.dev60/ominfra/clouds/aws/metadata.py +99 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60/ominfra.egg-info}/PKG-INFO +3 -3
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra.egg-info/SOURCES.txt +3 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra.egg-info/requires.txt +2 -2
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/pyproject.toml +3 -3
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/LICENSE +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/MANIFEST.in +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/README.rst +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/__about__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/__init__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/clouds/__init__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/clouds/aws/__init__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/clouds/aws/auth.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/cmds.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/__init__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/_executor.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/configs.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/executor/__init__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/executor/base.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/executor/concerns/__init__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/executor/concerns/dirs.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/executor/concerns/nginx.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/executor/concerns/repo.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/executor/concerns/supervisor.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/executor/concerns/systemd.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/executor/concerns/user.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/executor/concerns/venv.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/executor/main.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/__init__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/_main.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/base.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/configs.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/deploy.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/main.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/nginx.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/repo.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/runtime.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/site.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/supervisor.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/poly/venv.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/deploy/remote.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/manage/__init__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/manage/manage.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/pyremote/__init__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/pyremote/_runcommands.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/pyremote/bootstrap.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/pyremote/runcommands.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/ssh.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/tailscale/__init__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/tailscale/cli.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/tools/__init__.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra/tools/listresources.py +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra.egg-info/dependency_links.txt +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra.egg-info/entry_points.txt +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/ominfra.egg-info/top_level.txt +0 -0
- {ominfra-0.0.0.dev58 → ominfra-0.0.0.dev60}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ominfra
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev60
|
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.dev60
|
16
|
+
Requires-Dist: omlish==0.0.0.dev60
|
17
17
|
Provides-Extra: all
|
18
18
|
Requires-Dist: paramiko~=3.5; extra == "all"
|
19
19
|
Requires-Dist: asyncssh~=2.17; python_version < "3.13" and extra == "all"
|
@@ -1,4 +1,16 @@
|
|
1
1
|
[
|
2
|
+
{
|
3
|
+
"module": ".clouds.aws.__main__",
|
4
|
+
"attr": "_CLI_MODULE",
|
5
|
+
"file": "ominfra/clouds/aws/__main__.py",
|
6
|
+
"line": 4,
|
7
|
+
"value": {
|
8
|
+
"$omdev.cli.types.CliModule": {
|
9
|
+
"cmd_name": "aws",
|
10
|
+
"mod_name": "ominfra.clouds.aws.__main__"
|
11
|
+
}
|
12
|
+
}
|
13
|
+
},
|
2
14
|
{
|
3
15
|
"module": ".tailscale.cli",
|
4
16
|
"attr": "_CLI_MODULE",
|
@@ -0,0 +1,25 @@
|
|
1
|
+
from omlish import argparse as ap
|
2
|
+
from omlish.formats import json
|
3
|
+
|
4
|
+
from . import metadata
|
5
|
+
|
6
|
+
|
7
|
+
class Cli(ap.Cli):
|
8
|
+
@ap.command(
|
9
|
+
ap.arg('key', action='append'),
|
10
|
+
ap.arg('--url'),
|
11
|
+
)
|
12
|
+
def metadata(self) -> None:
|
13
|
+
md = metadata.read_metadata(
|
14
|
+
self.args.keys or metadata.DEFAULT_METADATA_KEYS,
|
15
|
+
url=self.args.url or metadata.DEFAULT_METADATA_URL,
|
16
|
+
)
|
17
|
+
print(json.dumps_pretty(md))
|
18
|
+
|
19
|
+
|
20
|
+
def _main() -> None:
|
21
|
+
Cli()()
|
22
|
+
|
23
|
+
|
24
|
+
if __name__ == '__main__':
|
25
|
+
_main()
|
@@ -0,0 +1,99 @@
|
|
1
|
+
"""
|
2
|
+
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` && \
|
3
|
+
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/
|
4
|
+
"""
|
5
|
+
import logging
|
6
|
+
import socket
|
7
|
+
import typing as ta
|
8
|
+
import urllib.error
|
9
|
+
import urllib.parse
|
10
|
+
import urllib.request
|
11
|
+
|
12
|
+
from omlish import check
|
13
|
+
from omlish import lang
|
14
|
+
|
15
|
+
|
16
|
+
DEFAULT_METADATA_URL = 'http://169.254.169.254/'
|
17
|
+
|
18
|
+
METADATA_TOKEN_HEADER = 'X-aws-ec2-metadata-token' # noqa
|
19
|
+
METADATA_TOKEN_TTL_HEADER = 'X-aws-ec2-metadata-token-ttl-seconds' # noqa
|
20
|
+
|
21
|
+
|
22
|
+
def read_metadata(
|
23
|
+
keys: ta.Iterable[str],
|
24
|
+
*,
|
25
|
+
url: str = DEFAULT_METADATA_URL,
|
26
|
+
version: str = 'latest',
|
27
|
+
ping_timeout_s: float = 10.,
|
28
|
+
token_ttl: int = 60,
|
29
|
+
encoding: str = 'utf-8',
|
30
|
+
) -> dict[str, str | None] | None:
|
31
|
+
check.not_isinstance(keys, str)
|
32
|
+
|
33
|
+
if not url.endswith('/'):
|
34
|
+
url += '/'
|
35
|
+
|
36
|
+
parsed: urllib.parse.ParseResult = urllib.parse.urlparse(url)
|
37
|
+
if not parsed.scheme:
|
38
|
+
url = 'http://' + url
|
39
|
+
parsed = urllib.parse.urlparse(url)
|
40
|
+
check.arg(bool(parsed.netloc))
|
41
|
+
|
42
|
+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as ping_sock:
|
43
|
+
ping_sock.settimeout(ping_timeout_s)
|
44
|
+
try:
|
45
|
+
ping_sock.connect((parsed.netloc, 80))
|
46
|
+
except OSError:
|
47
|
+
return None
|
48
|
+
|
49
|
+
with urllib.request.urlopen(urllib.request.Request( # noqa
|
50
|
+
urllib.parse.urljoin(url, f'{version}/api/token'),
|
51
|
+
method='PUT',
|
52
|
+
headers={
|
53
|
+
METADATA_TOKEN_TTL_HEADER: str(token_ttl),
|
54
|
+
},
|
55
|
+
)) as resp:
|
56
|
+
if resp.status != 200:
|
57
|
+
raise Exception(f'Failed to get token')
|
58
|
+
token = resp.read().decode(encoding).strip()
|
59
|
+
|
60
|
+
dct = {}
|
61
|
+
for key in keys:
|
62
|
+
try:
|
63
|
+
with urllib.request.urlopen(urllib.request.Request( # noqa
|
64
|
+
urllib.parse.urljoin(url, f'{version}/meta-data/{key}/'),
|
65
|
+
headers={
|
66
|
+
METADATA_TOKEN_HEADER: token,
|
67
|
+
},
|
68
|
+
)) as resp:
|
69
|
+
dct[key] = resp.read().decode(encoding)
|
70
|
+
except urllib.error.URLError:
|
71
|
+
dct[key] = None
|
72
|
+
return dct
|
73
|
+
|
74
|
+
|
75
|
+
DEFAULT_METADATA_KEYS: ta.AbstractSet[str] = {
|
76
|
+
'hostname',
|
77
|
+
'instance-id',
|
78
|
+
}
|
79
|
+
|
80
|
+
|
81
|
+
@lang.cached_function
|
82
|
+
def metadata() -> ta.Mapping[str, str | None] | None:
|
83
|
+
return read_metadata(DEFAULT_METADATA_KEYS)
|
84
|
+
|
85
|
+
|
86
|
+
##
|
87
|
+
|
88
|
+
|
89
|
+
class MetadataLogFilter(logging.Filter):
|
90
|
+
|
91
|
+
def filter(self, record):
|
92
|
+
md = metadata() or {}
|
93
|
+
record.aws_hostname = md.get('hostname', '?')
|
94
|
+
record.aws_instance_id = md.get('instance-id', '?')
|
95
|
+
return True
|
96
|
+
|
97
|
+
|
98
|
+
def configure_metadata_logging(handler: logging.Handler) -> None:
|
99
|
+
handler.addFilter(MetadataLogFilter())
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ominfra
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev60
|
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.dev60
|
16
|
+
Requires-Dist: omlish==0.0.0.dev60
|
17
17
|
Provides-Extra: all
|
18
18
|
Requires-Dist: paramiko~=3.5; extra == "all"
|
19
19
|
Requires-Dist: asyncssh~=2.17; python_version < "3.13" and extra == "all"
|
@@ -15,7 +15,10 @@ ominfra.egg-info/requires.txt
|
|
15
15
|
ominfra.egg-info/top_level.txt
|
16
16
|
ominfra/clouds/__init__.py
|
17
17
|
ominfra/clouds/aws/__init__.py
|
18
|
+
ominfra/clouds/aws/__main__.py
|
18
19
|
ominfra/clouds/aws/auth.py
|
20
|
+
ominfra/clouds/aws/cli.py
|
21
|
+
ominfra/clouds/aws/metadata.py
|
19
22
|
ominfra/deploy/__init__.py
|
20
23
|
ominfra/deploy/_executor.py
|
21
24
|
ominfra/deploy/configs.py
|
@@ -12,7 +12,7 @@ authors = [
|
|
12
12
|
urls = {source = 'https://github.com/wrmsr/omlish'}
|
13
13
|
license = {text = 'BSD-3-Clause'}
|
14
14
|
requires-python = '~=3.12'
|
15
|
-
version = '0.0.0.
|
15
|
+
version = '0.0.0.dev60'
|
16
16
|
classifiers = [
|
17
17
|
'License :: OSI Approved :: BSD License',
|
18
18
|
'Development Status :: 2 - Pre-Alpha',
|
@@ -22,8 +22,8 @@ classifiers = [
|
|
22
22
|
]
|
23
23
|
description = 'ominfra'
|
24
24
|
dependencies = [
|
25
|
-
'omdev == 0.0.0.
|
26
|
-
'omlish == 0.0.0.
|
25
|
+
'omdev == 0.0.0.dev60',
|
26
|
+
'omlish == 0.0.0.dev60',
|
27
27
|
]
|
28
28
|
|
29
29
|
[project.optional-dependencies]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|