Files
box/packages/protocol-muse/protocol_muse/fallback.py
T

62 lines
2.5 KiB
Python
Raw Normal View History

"""HTTPS fallback transport to Chromebox Gateway."""
import json
import os
import ssl
import urllib.request
import urllib.error
from typing import Dict, Any, Optional
class GatewayFallback:
"""Communicates with the Chromebox HTTPS gateway."""
def __init__(self, endpoint: Optional[str] = None, token: Optional[str] = None):
self.endpoint = endpoint or os.environ.get("CHROMEBOX_GATEWAY_URL", "https://100.123.153.75:8445")
self.token = token or self._resolve_token()
self._ctx = ssl.create_default_context()
self._ctx.check_hostname = False
self._ctx.verify_mode = ssl.CERT_NONE
def _resolve_token(self) -> str:
# Check env first
if "MUSE_GATEWAY_TOKEN" in os.environ:
return os.environ["MUSE_GATEWAY_TOKEN"]
# Check master token
master_path = os.path.expanduser("~/.exec-server-token")
if os.path.exists(master_path):
try:
with open(master_path) as f:
return f.read().strip()
except Exception:
pass
return ""
def _request(self, path: str, method: str = "GET", data: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
url = f"{self.endpoint.rstrip('/')}{path}"
body_bytes = json.dumps(data).encode("utf-8") if data is not None else None
headers = {"Content-Type": "application/json"}
if self.token:
headers["Authorization"] = f"Bearer {self.token}"
req = urllib.request.Request(url, data=body_bytes, headers=headers, method=method)
try:
with urllib.request.urlopen(req, context=self._ctx, timeout=15) as resp:
return json.loads(resp.read().decode("utf-8"))
except urllib.error.HTTPError as e:
try:
err_data = json.loads(e.read().decode("utf-8"))
return {"ok": False, "status": e.code, "error": err_data}
except Exception:
return {"ok": False, "status": e.code, "error": str(e)}
except Exception as e:
return {"ok": False, "error": str(e)}
def check_health(self) -> Dict[str, Any]:
return self._request("/health", method="GET")
def get_queue(self) -> Dict[str, Any]:
return self._request("/api/v1/queue", method="GET")
def execute_op(self, op: str, params: Dict[str, Any]) -> Dict[str, Any]:
payload = {"op": op, "params": params}
return self._request("/api/v1/op", method="POST", data=payload)