new changes
This commit is contained in:
Binary file not shown.
@@ -130,3 +130,86 @@ def exec_shell_sync(cmd: str, timeout: Optional[float] = None, cwd: Optional[str
|
||||
return "", "Timed out"
|
||||
except Exception as e:
|
||||
return "", str(e)
|
||||
|
||||
|
||||
def nginx_test_and_reload(nginx_bin: str, timeout: float = 60.0) -> Tuple[bool, str]:
|
||||
"""Run ``nginx -t`` then ``nginx -s reload``. Returns (success, error_message)."""
|
||||
if not nginx_bin or not os.path.isfile(nginx_bin):
|
||||
return True, ""
|
||||
env = environment_with_system_path()
|
||||
try:
|
||||
t = subprocess.run(
|
||||
[nginx_bin, "-t"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=timeout,
|
||||
env=env,
|
||||
)
|
||||
except (FileNotFoundError, OSError, subprocess.TimeoutExpired) as e:
|
||||
return False, str(e)
|
||||
if t.returncode != 0:
|
||||
err = (t.stderr or t.stdout or "").strip()
|
||||
return False, err or f"nginx -t exited {t.returncode}"
|
||||
try:
|
||||
r = subprocess.run(
|
||||
[nginx_bin, "-s", "reload"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=timeout,
|
||||
env=env,
|
||||
)
|
||||
except (FileNotFoundError, OSError, subprocess.TimeoutExpired) as e:
|
||||
return False, str(e)
|
||||
if r.returncode != 0:
|
||||
err = (r.stderr or r.stdout or "").strip()
|
||||
return False, err or f"nginx -s reload exited {r.returncode}"
|
||||
return True, ""
|
||||
|
||||
|
||||
def nginx_binary_candidates() -> list[str]:
|
||||
"""Nginx binaries to operate on: panel-bundled first, then common system paths (deduped by realpath)."""
|
||||
from app.core.config import get_runtime_config
|
||||
|
||||
cfg = get_runtime_config()
|
||||
seen: set[str] = set()
|
||||
binaries: list[str] = []
|
||||
panel_ngx = os.path.join(cfg.get("setup_path") or "", "nginx", "sbin", "nginx")
|
||||
if os.path.isfile(panel_ngx):
|
||||
binaries.append(panel_ngx)
|
||||
try:
|
||||
seen.add(os.path.realpath(panel_ngx))
|
||||
except OSError:
|
||||
seen.add(panel_ngx)
|
||||
for alt in ("/usr/sbin/nginx", "/usr/bin/nginx", "/usr/local/nginx/sbin/nginx"):
|
||||
if not os.path.isfile(alt):
|
||||
continue
|
||||
try:
|
||||
rp = os.path.realpath(alt)
|
||||
except OSError:
|
||||
rp = alt
|
||||
if rp in seen:
|
||||
continue
|
||||
binaries.append(alt)
|
||||
seen.add(rp)
|
||||
return binaries
|
||||
|
||||
|
||||
def nginx_reload_all_known(timeout: float = 60.0) -> Tuple[bool, str]:
|
||||
"""
|
||||
Test and reload panel nginx (setup_path/nginx/sbin/nginx) and distinct system nginx
|
||||
binaries so vhost changes apply regardless of which daemon serves sites.
|
||||
"""
|
||||
binaries = nginx_binary_candidates()
|
||||
if not binaries:
|
||||
return True, ""
|
||||
errs: list[str] = []
|
||||
ok_any = False
|
||||
for ngx in binaries:
|
||||
ok, err = nginx_test_and_reload(ngx, timeout=timeout)
|
||||
if ok:
|
||||
ok_any = True
|
||||
else:
|
||||
errs.append(f"{ngx}: {err}")
|
||||
if ok_any:
|
||||
return True, ""
|
||||
return False, "; ".join(errs) if errs else "nginx reload failed for all candidates"
|
||||
|
||||
Reference in New Issue
Block a user