from __future__ import annotations from typing import Any, Dict, cast from .models import * from .utils import strip_ansi class StatusApiMixin: # Status / system def get_status(self) -> Status: data = cast(Dict[str, Any], self._json(self._request("GET", "/api/v1/status")) or {}) return Status( timestamp=str(data.get("timestamp") or ""), ip_count=int(data.get("ip_count") or 0), domain_count=int(data.get("domain_count") or 0), iface=str(data.get("iface") or ""), table=str(data.get("table") or ""), mark=str(data.get("mark") or ""), policy_route_ok=cast(Optional[bool], data.get("policy_route_ok", None)), route_ok=cast(Optional[bool], data.get("route_ok", None)), ) def systemd_state(self, unit: str) -> UnitState: data = cast( Dict[str, Any], self._json( self._request("GET", "/api/v1/systemd/state", params={"unit": unit}, timeout=2.0) ) or {}, ) st = str(data.get("state") or "unknown").strip() or "unknown" return UnitState(state=st) def get_login_state(self) -> LoginState: data = cast(Dict[str, Any], self._json(self._request("GET", "/api/v1/vpn/login-state", timeout=2.0)) or {}) # Normalize and strip ANSI. state = str(data.get("state") or "unknown").strip() email = strip_ansi(str(data.get("email") or "").strip()) msg = strip_ansi(str(data.get("msg") or "").strip()) text = strip_ansi(str(data.get("text") or "").strip()) color = str(data.get("color") or "").strip() return LoginState( state=state, email=email, msg=msg, text=text, color=color, )