diff --git a/core/grafana_client.py b/core/grafana_client.py index 6ddb1e9..10f5f28 100644 --- a/core/grafana_client.py +++ b/core/grafana_client.py @@ -20,19 +20,25 @@ class GrafanaClient: Initialize the Grafana client. Args: - server: dict with keys: ip, port, api_token, use_ssl + server: dict with keys: ip, port, api_token (or user+password), use_ssl """ self.ip: str = server["ip"] self.port: int = int(server["port"]) - self.api_token: str = server["api_token"] + self.api_token: str = server.get("api_token", "") + self.user: str = server.get("user", "") + self.password: str = server.get("password", "") self.use_ssl: bool = bool(server.get("use_ssl", False)) scheme = "https" if self.use_ssl else "http" self.base_url: str = f"{scheme}://{self.ip}:{self.port}" - self.headers: dict[str, str] = { - "Authorization": f"Bearer {self.api_token}", - "Content-Type": "application/json", - } + self.headers: dict[str, str] = {"Content-Type": "application/json"} + self.auth: tuple[str, str] | None = None + + if self.api_token: + self.headers["Authorization"] = f"Bearer {self.api_token}" + elif self.user and self.password: + self.auth = (self.user, self.password) + self.timeout: int = 10 def _get(self, path: str, params: dict | None = None) -> Any: @@ -42,7 +48,7 @@ class GrafanaClient: url = f"{self.base_url}{path}" log.debug("Grafana GET %s", url) resp = requests.get( - url, headers=self.headers, params=params, timeout=self.timeout + url, headers=self.headers, params=params, auth=self.auth, timeout=self.timeout ) resp.raise_for_status() return resp.json() @@ -54,7 +60,7 @@ class GrafanaClient: url = f"{self.base_url}{path}" log.debug("Grafana POST %s", url) resp = requests.post( - url, headers=self.headers, json=json_data, timeout=self.timeout + url, headers=self.headers, json=json_data, auth=self.auth, timeout=self.timeout ) resp.raise_for_status() return resp.json() diff --git a/gui/server_dialog.py b/gui/server_dialog.py index 52aea6c..b855976 100644 --- a/gui/server_dialog.py +++ b/gui/server_dialog.py @@ -20,7 +20,7 @@ FIELD_MAP = { "mssql": ["user", "password", "database"], "postgresql": ["user", "password", "database"], "redis": ["password", "db_index", "use_ssl"], - "grafana": ["api_token", "use_ssl"], + "grafana": ["user", "password", "api_token", "use_ssl"], "prometheus": ["use_ssl"], "rdp": ["user", "password", "rdp_resolution", "rdp_quality", "rdp_clipboard", "rdp_drives", "rdp_printers"], "vnc": ["password"], diff --git a/releases/ServerManager-v1.9.35-win-x64.exe b/releases/ServerManager-v1.9.40-win-x64.exe similarity index 98% rename from releases/ServerManager-v1.9.35-win-x64.exe rename to releases/ServerManager-v1.9.40-win-x64.exe index 55ea78e..c9ab041 100644 Binary files a/releases/ServerManager-v1.9.35-win-x64.exe and b/releases/ServerManager-v1.9.40-win-x64.exe differ diff --git a/tools/ssh.py b/tools/ssh.py index 8a58d24..7b7232a 100644 --- a/tools/ssh.py +++ b/tools/ssh.py @@ -1511,16 +1511,19 @@ def _grafana_request(server: dict, endpoint: str) -> dict: import requests host = server["ip"] port = server.get("port", 3000) - protocol = "https" if server.get("ssl", False) else "http" + protocol = "https" if server.get("use_ssl", server.get("ssl", False)) else "http" base_url = server.get("base_url", f"{protocol}://{host}:{port}") - api_key = server.get("api_key", server.get("password", "")) + api_token = server.get("api_token", server.get("api_key", "")) headers = {} - if api_key: - headers["Authorization"] = f"Bearer {api_key}" + auth = None + if api_token: + headers["Authorization"] = f"Bearer {api_token}" + elif server.get("user") and server.get("password"): + auth = (server["user"], server["password"]) url = f"{base_url.rstrip('/')}/api/{endpoint.lstrip('/')}" - resp = requests.get(url, headers=headers, timeout=15, verify=server.get("ssl_verify", True)) + resp = requests.get(url, headers=headers, auth=auth, timeout=15, verify=server.get("ssl_verify", True)) resp.raise_for_status() return resp.json() diff --git a/version.py b/version.py index 3878eb7..515f160 100755 --- a/version.py +++ b/version.py @@ -1,6 +1,6 @@ """Version info for ServerManager.""" -__version__ = "1.9.39" +__version__ = "1.9.40" __app_name__ = "ServerManager" __author__ = "aibot777" __description__ = "Desktop GUI for managing remote servers"