ominfra 0.0.0.dev59__tar.gz → 0.0.0.dev61__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.
Files changed (60) hide show
  1. {ominfra-0.0.0.dev59/ominfra.egg-info → ominfra-0.0.0.dev61}/PKG-INFO +3 -3
  2. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/.manifests.json +12 -0
  3. ominfra-0.0.0.dev61/ominfra/clouds/aws/__main__.py +11 -0
  4. ominfra-0.0.0.dev61/ominfra/clouds/aws/cli.py +25 -0
  5. ominfra-0.0.0.dev61/ominfra/clouds/aws/metadata.py +99 -0
  6. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61/ominfra.egg-info}/PKG-INFO +3 -3
  7. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra.egg-info/SOURCES.txt +3 -0
  8. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra.egg-info/requires.txt +2 -2
  9. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/pyproject.toml +3 -3
  10. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/LICENSE +0 -0
  11. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/MANIFEST.in +0 -0
  12. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/README.rst +0 -0
  13. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/__about__.py +0 -0
  14. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/__init__.py +0 -0
  15. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/clouds/__init__.py +0 -0
  16. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/clouds/aws/__init__.py +0 -0
  17. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/clouds/aws/auth.py +0 -0
  18. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/cmds.py +0 -0
  19. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/__init__.py +0 -0
  20. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/_executor.py +0 -0
  21. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/configs.py +0 -0
  22. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/executor/__init__.py +0 -0
  23. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/executor/base.py +0 -0
  24. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/executor/concerns/__init__.py +0 -0
  25. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/executor/concerns/dirs.py +0 -0
  26. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/executor/concerns/nginx.py +0 -0
  27. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/executor/concerns/repo.py +0 -0
  28. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/executor/concerns/supervisor.py +0 -0
  29. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/executor/concerns/systemd.py +0 -0
  30. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/executor/concerns/user.py +0 -0
  31. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/executor/concerns/venv.py +0 -0
  32. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/executor/main.py +0 -0
  33. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/__init__.py +0 -0
  34. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/_main.py +0 -0
  35. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/base.py +0 -0
  36. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/configs.py +0 -0
  37. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/deploy.py +0 -0
  38. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/main.py +0 -0
  39. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/nginx.py +0 -0
  40. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/repo.py +0 -0
  41. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/runtime.py +0 -0
  42. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/site.py +0 -0
  43. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/supervisor.py +0 -0
  44. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/poly/venv.py +0 -0
  45. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/deploy/remote.py +0 -0
  46. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/manage/__init__.py +0 -0
  47. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/manage/manage.py +0 -0
  48. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/pyremote/__init__.py +0 -0
  49. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/pyremote/_runcommands.py +0 -0
  50. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/pyremote/bootstrap.py +0 -0
  51. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/pyremote/runcommands.py +0 -0
  52. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/ssh.py +0 -0
  53. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/tailscale/__init__.py +0 -0
  54. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/tailscale/cli.py +0 -0
  55. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/tools/__init__.py +0 -0
  56. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra/tools/listresources.py +0 -0
  57. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra.egg-info/dependency_links.txt +0 -0
  58. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra.egg-info/entry_points.txt +0 -0
  59. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/ominfra.egg-info/top_level.txt +0 -0
  60. {ominfra-0.0.0.dev59 → ominfra-0.0.0.dev61}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ominfra
3
- Version: 0.0.0.dev59
3
+ Version: 0.0.0.dev61
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.dev59
16
- Requires-Dist: omlish==0.0.0.dev59
15
+ Requires-Dist: omdev==0.0.0.dev61
16
+ Requires-Dist: omlish==0.0.0.dev61
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,11 @@
1
+ from omdev.cli import CliModule
2
+
3
+
4
+ # @omlish-manifest
5
+ _CLI_MODULE = CliModule('aws', __name__)
6
+
7
+
8
+ if __name__ == '__main__':
9
+ from .cli import _main
10
+
11
+ _main()
@@ -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', nargs='*'),
10
+ ap.arg('--url'),
11
+ )
12
+ def metadata(self) -> None:
13
+ md = metadata.read_metadata(
14
+ self.args.key 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.dev59
3
+ Version: 0.0.0.dev61
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.dev59
16
- Requires-Dist: omlish==0.0.0.dev59
15
+ Requires-Dist: omdev==0.0.0.dev61
16
+ Requires-Dist: omlish==0.0.0.dev61
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
@@ -1,5 +1,5 @@
1
- omdev==0.0.0.dev59
2
- omlish==0.0.0.dev59
1
+ omdev==0.0.0.dev61
2
+ omlish==0.0.0.dev61
3
3
 
4
4
  [all]
5
5
  paramiko~=3.5
@@ -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.dev59'
15
+ version = '0.0.0.dev61'
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.dev59',
26
- 'omlish == 0.0.0.dev59',
25
+ 'omdev == 0.0.0.dev61',
26
+ 'omlish == 0.0.0.dev61',
27
27
  ]
28
28
 
29
29
  [project.optional-dependencies]
File without changes
File without changes
File without changes
File without changes