sync dari sicabe-doc/deploy @ e8f8fde

This commit is contained in:
2026-10-11 18:13:03 +07:00
parent 6e4dfb69ef
commit 9f454b6e8e
12 changed files with 191 additions and 29 deletions
+41
View File
@@ -145,6 +145,47 @@ def external_address(doc: dict, service: str) -> str | None:
return a or None
# Port default per skema — dipakai parse_address() bila operator menulis URL penuh
# TANPA port (mis. `https://sso.example.com` → port 443).
_DEFAULT_SCHEME_PORT = {
"https": 443, "http": 80, "ldaps": 636, "ldap": 389,
"postgres": 5432, "postgresql": 5432,
}
def parse_address(addr: str) -> tuple[str, str, int | None]:
"""Pisah alamat komponen → (skema, host, port).
Menerima dua bentuk:
- **URL penuh** (skema eksplisit): `https://sso.example.com` → ('https','sso.example.com',443)
`http://minio.corp:9000` → ('http','minio.corp',9000)
- **host/IP polos** (perilaku lama): `sso.example.com` → ('','sso.example.com',None)
`10.20.0.10` → ('','10.20.0.10',None)
Skema non-standar diterima apa adanya; path (`/foo`) dibuang.
"""
a = (addr or "").strip()
scheme = ""
if "://" in a:
scheme, a = a.split("://", 1)
scheme = scheme.strip().lower()
a = a.split("/", 1)[0] # buang path bila ada
host, sep, port_s = a.rpartition(":")
# host:port HANYA bila tepat satu ':' dan port numerik — melindungi IPv6
# (mis. `2001:db8::1`) agar tak salah dipecah.
if sep and port_s.isdigit() and a.count(":") == 1:
host, port = host, int(port_s)
else:
host, port = a, _DEFAULT_SCHEME_PORT.get(scheme)
return scheme, host, port
def external_host(doc: dict, service: str) -> str | None:
"""HOST saja (tanpa skema/port) dari alamat eksternal — untuk var `*_HOST`."""
a = external_address(doc, service)
return parse_address(a)[1] if a else None
def resolve(doc: dict) -> dict[str, list[str]]:
"""Komponen → daftar host (tier `engine` bisa >1 host). Komponen EKSTERNAL
(ber-`address`) TIDAK masuk hasil — ia bukan milik host mana pun."""