import json from datetime import datetime import pytz import tornado from core.config import MAX_SPOT_AGE, ALLOW_SPOTTING, WEB_UI_OPTIONS from core.constants import BANDS, ALL_MODES, MODE_TYPES, SIGS, CONTINENTS from core.prometheus_metrics_handler import api_requests_counter from core.utils import serialize_everything # API request handler for /api/v1/options class APIOptionsHandler(tornado.web.RequestHandler): def initialize(self, status_data, web_server_metrics): self.status_data = status_data self.web_server_metrics = web_server_metrics def get(self): # Metrics self.web_server_metrics["last_api_access_time"] = datetime.now(pytz.UTC) self.web_server_metrics["api_access_counter"] += 1 self.web_server_metrics["status"] = "OK" api_requests_counter.inc() options = {"bands": BANDS, "modes": ALL_MODES, "mode_types": MODE_TYPES, "sigs": SIGS, # Spot/alert sources are filtered for only ones that are enabled in config, no point letting the user toggle things that aren't even available. "spot_sources": list( map(lambda p: p["name"], filter(lambda p: p["enabled"], self.status_data["spot_providers"]))), "alert_sources": list( map(lambda p: p["name"], filter(lambda p: p["enabled"], self.status_data["alert_providers"]))), "continents": CONTINENTS, "max_spot_age": MAX_SPOT_AGE, "spot_allowed": ALLOW_SPOTTING} # If spotting to this server is enabled, "API" is another valid spot source even though it does not come from # one of our proviers. if ALLOW_SPOTTING: options["spot_sources"].append("API") self.write(json.dumps(options, default=serialize_everything)) self.set_status(200) self.set_header("Cache-Control", "no-store") self.set_header("Content-Type", "application/json")