omserv 0.0.0.dev23__tar.gz → 0.0.0.dev24__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 (55) hide show
  1. {omserv-0.0.0.dev23/omserv.egg-info → omserv-0.0.0.dev24}/PKG-INFO +2 -2
  2. omserv-0.0.0.dev24/omserv/nginx/build.py +122 -0
  3. omserv-0.0.0.dev24/omserv/nginx/configs.py +86 -0
  4. omserv-0.0.0.dev24/omserv/nginx/stubstatus.py +73 -0
  5. omserv-0.0.0.dev24/omserv/node/__init__.py +0 -0
  6. omserv-0.0.0.dev24/omserv/server/streams/__init__.py +0 -0
  7. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24/omserv.egg-info}/PKG-INFO +2 -2
  8. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv.egg-info/SOURCES.txt +5 -0
  9. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv.egg-info/requires.txt +1 -1
  10. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/pyproject.toml +2 -2
  11. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/LICENSE +0 -0
  12. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/MANIFEST.in +0 -0
  13. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/README.rst +0 -0
  14. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/__about__.py +0 -0
  15. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/__init__.py +0 -0
  16. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/apps/__init__.py +0 -0
  17. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/apps/base.py +0 -0
  18. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/apps/inject.py +0 -0
  19. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/apps/markers.py +0 -0
  20. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/apps/routes.py +0 -0
  21. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/apps/sessions.py +0 -0
  22. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/apps/templates.py +0 -0
  23. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/dbs.py +0 -0
  24. {omserv-0.0.0.dev23/omserv/node → omserv-0.0.0.dev24/omserv/nginx}/__init__.py +0 -0
  25. {omserv-0.0.0.dev23/omserv/server/streams → omserv-0.0.0.dev24/omserv/nginx/patches}/__init__.py +0 -0
  26. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/node/models.py +0 -0
  27. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/node/registry.py +0 -0
  28. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/node/sql.py +0 -0
  29. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/secrets.py +0 -0
  30. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/__init__.py +0 -0
  31. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/config.py +0 -0
  32. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/debug.py +0 -0
  33. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/events.py +0 -0
  34. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/headers.py +0 -0
  35. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/lifespans.py +0 -0
  36. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/multiprocess.py +0 -0
  37. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/protocols/__init__.py +0 -0
  38. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/protocols/h11.py +0 -0
  39. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/protocols/h2.py +0 -0
  40. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/protocols/protocols.py +0 -0
  41. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/protocols/types.py +0 -0
  42. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/resources/__init__.py +0 -0
  43. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/sockets.py +0 -0
  44. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/ssl.py +0 -0
  45. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/streams/httpstream.py +0 -0
  46. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/streams/utils.py +0 -0
  47. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/streams/wsstream.py +0 -0
  48. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/taskspawner.py +0 -0
  49. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/tcpserver.py +0 -0
  50. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/types.py +0 -0
  51. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/workercontext.py +0 -0
  52. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv/server/workers.py +0 -0
  53. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv.egg-info/dependency_links.txt +0 -0
  54. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/omserv.egg-info/top_level.txt +0 -0
  55. {omserv-0.0.0.dev23 → omserv-0.0.0.dev24}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omserv
3
- Version: 0.0.0.dev23
3
+ Version: 0.0.0.dev24
4
4
  Summary: omserv
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ 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: omlish==0.0.0.dev23
15
+ Requires-Dist: omlish==0.0.0.dev24
16
16
  Provides-Extra: all
17
17
  Requires-Dist: h11~=0.14; extra == "all"
18
18
  Requires-Dist: h2~=4.1; extra == "all"
@@ -0,0 +1,122 @@
1
+ import multiprocessing
2
+ import os.path
3
+ import shutil
4
+ import subprocess
5
+ import sys
6
+ import tempfile
7
+ import urllib.request
8
+
9
+ from omlish import check
10
+ from omlish import lang
11
+
12
+
13
+ NGINX_VERSION = '1.27.0'
14
+ NGINX_SRC_URL = f'https://nginx.org/download/nginx-{NGINX_VERSION}.tar.gz'
15
+
16
+ NGINX_VTS_VERSION = '0.2.2'
17
+ NGINX_VTS_SRC_URL = f'https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v{NGINX_VTS_VERSION}.tar.gz'
18
+
19
+
20
+ def build_nginx() -> None:
21
+ build_dir = tempfile.mkdtemp('-omlish-nginx-build')
22
+ print(f'{build_dir=}')
23
+
24
+ #
25
+
26
+ nginx_src_file = urllib.request.urlretrieve(NGINX_SRC_URL)[0] # noqa
27
+ print(f'{nginx_src_file=}')
28
+
29
+ nginx_vts_src_file = urllib.request.urlretrieve(NGINX_VTS_SRC_URL)[0] # noqa
30
+ print(f'{nginx_vts_src_file=}')
31
+
32
+ subprocess.check_call(['tar', 'xvzf', nginx_src_file, '-C', build_dir])
33
+ nginx_dir = os.path.join(build_dir, f'nginx-{NGINX_VERSION}')
34
+
35
+ subprocess.check_call(['tar', 'xvzf', nginx_vts_src_file, '-C', build_dir])
36
+ nginx_vts_dir = os.path.join(build_dir, f'nginx-module-vts-{NGINX_VTS_VERSION}')
37
+
38
+ #
39
+
40
+ patch_prefix = f'nginx-{NGINX_VERSION}_'
41
+ for r in lang.get_relative_resources('patches', globals=globals()).values():
42
+ if r.is_file and r.name.startswith(patch_prefix) and r.name.endswith('.patch'):
43
+ print(r.name)
44
+
45
+ patch_src = r.read_bytes()
46
+ subprocess.run(
47
+ ['git', 'apply'],
48
+ cwd=nginx_dir,
49
+ input=patch_src,
50
+ check=True,
51
+ )
52
+
53
+ #
54
+
55
+ cflags = [
56
+ '-g',
57
+ '-O2',
58
+ '-fstack-protector',
59
+ ]
60
+ ldflags = []
61
+
62
+ if sys.platform == 'darwin':
63
+ openssl_prefix = subprocess.check_output(['brew', '--prefix', 'openssl']).decode().strip()
64
+ pcre_prefix = subprocess.check_output(['brew', '--prefix', 'pcre']).decode().strip()
65
+ cflags.extend([
66
+ f'-I{openssl_prefix}/include',
67
+ f'-I{pcre_prefix}/include',
68
+ ])
69
+ ldflags.extend([
70
+ f'-L{openssl_prefix}/lib',
71
+ f'-L{pcre_prefix}/lib',
72
+ ])
73
+
74
+ subprocess.check_call([
75
+ check.not_none(shutil.which('sh')),
76
+
77
+ 'configure',
78
+
79
+ f'--with-cc-opt={" ".join(cflags)}',
80
+ f'--with-ld-opt={" ".join(ldflags)}',
81
+
82
+ '--with-compat',
83
+ '--with-threads',
84
+ '--with-debug',
85
+ '--with-ipv6',
86
+ '--with-pcre',
87
+ '--with-pcre-jit',
88
+
89
+ '--with-http_auth_request_module',
90
+ '--with-http_gunzip_module',
91
+ '--with-http_gzip_static_module',
92
+ '--with-http_ssl_module',
93
+ '--with-http_stub_status_module',
94
+ '--with-http_v2_module',
95
+
96
+ '--with-stream',
97
+ '--with-stream_ssl_module',
98
+ '--with-stream_ssl_preread_module',
99
+
100
+ f'--add-module={nginx_vts_dir}',
101
+ ], cwd=nginx_dir)
102
+
103
+ #
104
+
105
+ make_jobs = max(multiprocessing.cpu_count() // 2, 1)
106
+ subprocess.check_call([
107
+ 'make',
108
+ f'-j{make_jobs}',
109
+ ], cwd=nginx_dir)
110
+
111
+ #
112
+
113
+ exe_file = os.path.join(nginx_dir, 'objs', 'nginx')
114
+ print(exe_file)
115
+
116
+
117
+ def _main() -> None:
118
+ build_nginx()
119
+
120
+
121
+ if __name__ == '__main__':
122
+ _main()
@@ -0,0 +1,86 @@
1
+ """
2
+ TODO:
3
+ - omnibus/jmespath
4
+
5
+ https://nginx.org/en/docs/dev/development_guide.html
6
+ https://nginx.org/en/docs/dev/development_guide.html#config_directives
7
+ https://nginx.org/en/docs/example.html
8
+
9
+ https://github.com/yandex/gixy
10
+ """
11
+ import dataclasses as dc
12
+ import typing as ta
13
+
14
+ from omlish import check
15
+ from omlish import lang
16
+ from omlish.text.indent import IndentWriter
17
+
18
+
19
+ @dc.dataclass()
20
+ class Items(lang.Final):
21
+ lst: list['Item']
22
+
23
+ @classmethod
24
+ def of(cls, obj: ta.Any) -> 'Items':
25
+ if isinstance(obj, Items):
26
+ return obj
27
+ return cls([Item.of(e) for e in check.isinstance(obj, list)])
28
+
29
+
30
+ @dc.dataclass()
31
+ class Item(lang.Final):
32
+ name: str
33
+ args: list[str] | None = None
34
+ block: Items | None = None
35
+
36
+ @classmethod
37
+ def of(cls, obj: ta.Any) -> 'Item':
38
+ if isinstance(obj, Item):
39
+ return obj
40
+ args = check.isinstance(obj, tuple)
41
+ name, args = check.isinstance(args[0], str), args[1:]
42
+ if args and not isinstance(args[-1], str):
43
+ block, args = Items.of(args[-1]), args[:-1]
44
+ else:
45
+ block = None
46
+ return Item(name, [check.isinstance(e, str) for e in args], block=block)
47
+
48
+
49
+ def render(wr: IndentWriter, obj: ta.Any) -> None:
50
+ if isinstance(obj, Item):
51
+ wr.write(obj.name)
52
+ for e in obj.args or ():
53
+ wr.write(' ')
54
+ wr.write(e)
55
+ if obj.block:
56
+ wr.write(' {\n')
57
+ with wr.indent():
58
+ render(wr, obj.block)
59
+ wr.write('}\n')
60
+ else:
61
+ wr.write(';\n')
62
+
63
+ elif isinstance(obj, Items):
64
+ for e2 in obj.lst:
65
+ render(wr, e2)
66
+
67
+ else:
68
+ raise TypeError(obj)
69
+
70
+
71
+ def _main() -> None:
72
+ conf = Items.of([
73
+ ('user', 'www', 'www'),
74
+ ('worker_processes', '2'),
75
+ ('events', [
76
+ ('worker_connections', '2000'),
77
+ ]),
78
+ ])
79
+
80
+ wr = IndentWriter()
81
+ render(wr, conf)
82
+ print(wr.getvalue())
83
+
84
+
85
+ if __name__ == '__main__':
86
+ _main()
@@ -0,0 +1,73 @@
1
+ import dataclasses as dc
2
+ import re
3
+ import textwrap
4
+ import typing as ta
5
+
6
+
7
+ @dc.dataclass(frozen=True, kw_only=True)
8
+ class StubStatus:
9
+ active: int
10
+
11
+ # std: accepts handled requests
12
+ # ext: 2xx 4xx 5xx
13
+ counts: ta.Mapping[str, int]
14
+
15
+ reading: int
16
+ writing: int
17
+ waiting: int
18
+
19
+
20
+ _ACTIVE_PAT = re.compile(r'^Active connections: (?P<active>\d+)')
21
+ _RWW_PAT = re.compile(r'^Reading: (?P<reading>\d+) Writing: (?P<writing>\d+) Waiting: (?P<waiting>\d+)')
22
+
23
+
24
+ def parse_stub_status(s: str) -> StubStatus:
25
+ # Active connections: 1
26
+ # server accepts handled requests 2xx 4xx 5xx
27
+ # 20 20 20 18 1 0
28
+ # Reading: 0 Writing: 1 Waiting: 0
29
+
30
+ lines = [l for l in s.splitlines() for l in [l.strip()] if l]
31
+ if len(lines) < 4:
32
+ raise Exception('Not enough lines')
33
+
34
+ if (active_m := _ACTIVE_PAT.match(lines[0])) is None:
35
+ raise Exception('Failed to match active line')
36
+ active = int(active_m.groupdict()['active'])
37
+
38
+ if (rww_m := _RWW_PAT.match(lines[3])) is None:
39
+ raise Exception('Failed to match rww line')
40
+ reading = int(rww_m.groupdict()['reading'])
41
+ writing = int(rww_m.groupdict()['writing'])
42
+ waiting = int(rww_m.groupdict()['waiting'])
43
+
44
+ ct_lbl = lines[1].split()[1:]
45
+ ct_val = lines[2].split()
46
+ if len(ct_lbl) != len(ct_val):
47
+ raise Exception('Counts label/value mismatch')
48
+ counts = {l: int(v) for l, v in zip(ct_lbl, ct_val)}
49
+
50
+ return StubStatus(
51
+ active=active,
52
+
53
+ counts=counts,
54
+
55
+ reading=reading,
56
+ writing=writing,
57
+ waiting=waiting,
58
+ )
59
+
60
+
61
+ def _main() -> None:
62
+ s = textwrap.dedent("""
63
+ Active connections: 1
64
+ server accepts handled requests 2xx 4xx 5xx
65
+ 20 20 20 18 1 0
66
+ Reading: 0 Writing: 1 Waiting: 0
67
+ """)
68
+ ss = parse_stub_status(s)
69
+ print(ss)
70
+
71
+
72
+ if __name__ == '__main__':
73
+ _main()
File without changes
File without changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omserv
3
- Version: 0.0.0.dev23
3
+ Version: 0.0.0.dev24
4
4
  Summary: omserv
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ 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: omlish==0.0.0.dev23
15
+ Requires-Dist: omlish==0.0.0.dev24
16
16
  Provides-Extra: all
17
17
  Requires-Dist: h11~=0.14; extra == "all"
18
18
  Requires-Dist: h2~=4.1; extra == "all"
@@ -18,6 +18,11 @@ omserv/apps/markers.py
18
18
  omserv/apps/routes.py
19
19
  omserv/apps/sessions.py
20
20
  omserv/apps/templates.py
21
+ omserv/nginx/__init__.py
22
+ omserv/nginx/build.py
23
+ omserv/nginx/configs.py
24
+ omserv/nginx/stubstatus.py
25
+ omserv/nginx/patches/__init__.py
21
26
  omserv/node/__init__.py
22
27
  omserv/node/models.py
23
28
  omserv/node/registry.py
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev23
1
+ omlish==0.0.0.dev24
2
2
 
3
3
  [all]
4
4
  h11~=0.14
@@ -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.dev23'
15
+ version = '0.0.0.dev24'
16
16
  classifiers = [
17
17
  'License :: OSI Approved :: BSD License',
18
18
  'Development Status :: 2 - Pre-Alpha',
@@ -22,7 +22,7 @@ classifiers = [
22
22
  ]
23
23
  description = 'omserv'
24
24
  dependencies = [
25
- 'omlish == 0.0.0.dev23',
25
+ 'omlish == 0.0.0.dev24',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]
File without changes
File without changes
File without changes
File without changes
File without changes