fix(gateway): surface missing linger in status and doctor (#1296)

* fix(gateway): surface missing linger in status and doctor

Warn when a systemd user gateway service has linger disabled so users can
spot the common 'gateway sleeps after logout' deployment issue from both
hermes doctor and hermes gateway status.

* fix(gateway): check linger status after install

After installing the systemd user service, report whether linger is
already enabled instead of always printing the generic hint. This makes
post-install guidance match the user's actual deployment state.
This commit is contained in:
Teknium 2026-03-14 06:11:33 -07:00 committed by GitHub
parent 6fa197f973
commit fb3c163612
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 231 additions and 7 deletions

View file

@ -9,6 +9,7 @@ from types import SimpleNamespace
import pytest
import hermes_cli.doctor as doctor
import hermes_cli.gateway as gateway_cli
from hermes_cli import doctor as doctor_mod
from hermes_cli.doctor import _has_provider_env_config
@ -101,3 +102,37 @@ def test_run_doctor_sets_interactive_env_for_tool_checks(monkeypatch, tmp_path):
doctor_mod.run_doctor(Namespace(fix=False))
assert seen["interactive"] == "1"
def test_check_gateway_service_linger_warns_when_disabled(monkeypatch, tmp_path, capsys):
unit_path = tmp_path / "hermes-gateway.service"
unit_path.write_text("[Unit]\n")
monkeypatch.setattr(gateway_cli, "is_linux", lambda: True)
monkeypatch.setattr(gateway_cli, "get_systemd_unit_path", lambda: unit_path)
monkeypatch.setattr(gateway_cli, "get_systemd_linger_status", lambda: (False, ""))
issues = []
doctor._check_gateway_service_linger(issues)
out = capsys.readouterr().out
assert "Gateway Service" in out
assert "Systemd linger disabled" in out
assert "loginctl enable-linger" in out
assert issues == [
"Enable linger for the gateway user service: sudo loginctl enable-linger $USER"
]
def test_check_gateway_service_linger_skips_when_service_not_installed(monkeypatch, tmp_path, capsys):
unit_path = tmp_path / "missing.service"
monkeypatch.setattr(gateway_cli, "is_linux", lambda: True)
monkeypatch.setattr(gateway_cli, "get_systemd_unit_path", lambda: unit_path)
issues = []
doctor._check_gateway_service_linger(issues)
out = capsys.readouterr().out
assert out == ""
assert issues == []