51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
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,
|
|
)
|