[m] 27-fix-http-server

1. update http-server
This commit is contained in:
Siarhei Siniak 2025-04-26 14:40:16 +03:00
commit 56c2eb1671
6 changed files with 71 additions and 6 deletions

@ -1158,6 +1158,7 @@ done'
) )
def http_server(argv): def http_server(argv):
from .commands_typed import os as commands_os
assert isinstance(argv, list) and all([isinstance(o, str) for o in argv]) assert isinstance(argv, list) and all([isinstance(o, str) for o in argv])
parser = optparse.OptionParser() parser = optparse.OptionParser()
parser.add_option( parser.add_option(
@ -1214,11 +1215,33 @@ def http_server(argv):
assert options.port >= 1 assert options.port >= 1
try: try:
if not options.docker and options.host == '0.0.0.0':
found : bool = False
for o in commands_os.interfaces_index():
if found:
break
for o2 in o.addr_info:
if o2.family == 'inet' and o2.local != '127.0.0.1':
options.host = o2.local
logger.info(dict(
host=options.host,
msg='found',
))
found = True
break
assert not socket.inet_aton(options.host) is None assert not socket.inet_aton(options.host) is None
subprocess.check_call([ # subprocess.check_call([
'ping', '-w', '1', # 'ping', '-w', '1',
options.host # options.host
]) # ])
assert options.host in sum([
[
o2.local
for o2 in o.addr_info
]
for o in commands_os.interfaces_index()
], [])
except Exception: except Exception:
raise RuntimeError('invalid ip address %s' % options.host) raise RuntimeError('invalid ip address %s' % options.host)

@ -1,14 +1,17 @@
import shutil import shutil
import glob import glob
import subprocess
import pydantic
import pathlib import pathlib
import ctypes import ctypes
import os import os
import sys import sys
import logging import logging
import dataclasses
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
from typing import (overload, Optional, Literal,) from typing import (overload, Optional, Literal, Any, Annotated,)
from .cli_bootstrap import PyProject from .cli_bootstrap import PyProject
@ -90,3 +93,30 @@ def runtime_libdirs_init(
ctypes.cdll.LoadLibrary(preload_found) ctypes.cdll.LoadLibrary(preload_found)
else: else:
raise NotImplementedError raise NotImplementedError
class interfaces_index_t:
@dataclasses.dataclass
class Interface:
@dataclasses.dataclass
class AddrInfo:
family: str
local: str
name: Annotated[
str,
pydantic.Field(
alias='ifname',
)
]
addr_info: list[AddrInfo]
def interfaces_index() -> list[interfaces_index_t.Interface]:
res = pydantic.RootModel[
list[interfaces_index_t.Interface]
].model_validate_json(
subprocess.check_output([
'ip', '-j', 'addr',
]).decode('utf-8')
).root
return res

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.