diff --git a/app/ui.py b/app/ui.py index d67b3a5..4d91f03 100644 --- a/app/ui.py +++ b/app/ui.py @@ -508,11 +508,15 @@ def bucket_detail(bucket_name: str): can_manage_quota = is_replication_admin website_config = None + website_domains = [] if website_hosting_enabled: try: website_config = storage.get_bucket_website(bucket_name) except StorageError: website_config = None + domain_store = current_app.extensions.get("website_domains") + if domain_store: + website_domains = domain_store.get_domains_for_bucket(bucket_name) objects_api_url = url_for("ui.list_bucket_objects", bucket_name=bucket_name) objects_stream_url = url_for("ui.stream_bucket_objects", bucket_name=bucket_name) @@ -558,6 +562,7 @@ def bucket_detail(bucket_name: str): site_sync_enabled=site_sync_enabled, website_hosting_enabled=website_hosting_enabled, website_config=website_config, + website_domains=website_domains, can_manage_website=can_edit_policy, ) @@ -2374,7 +2379,10 @@ def website_domains_dashboard(): store = current_app.extensions.get("website_domains") mappings = store.list_all() if store else [] storage = _storage() - buckets = [b.name for b in storage.list_buckets()] + buckets = [ + b.name for b in storage.list_buckets() + if storage.get_bucket_website(b.name) + ] return render_template( "website_domains.html", mappings=mappings, diff --git a/app/website_domains.py b/app/website_domains.py index d18c43c..7ec33f7 100644 --- a/app/website_domains.py +++ b/app/website_domains.py @@ -35,13 +35,16 @@ class WebsiteDomainStore: self.config_path = config_path self._lock = threading.Lock() self._domains: Dict[str, str] = {} + self._last_mtime: float = 0.0 self.reload() def reload(self) -> None: if not self.config_path.exists(): self._domains = {} + self._last_mtime = 0.0 return try: + self._last_mtime = self.config_path.stat().st_mtime with open(self.config_path, "r", encoding="utf-8") as f: data = json.load(f) if isinstance(data, dict): @@ -51,19 +54,45 @@ class WebsiteDomainStore: except (OSError, json.JSONDecodeError): self._domains = {} + def _maybe_reload(self) -> None: + try: + if self.config_path.exists(): + mtime = self.config_path.stat().st_mtime + if mtime != self._last_mtime: + self._last_mtime = mtime + with open(self.config_path, "r", encoding="utf-8") as f: + data = json.load(f) + if isinstance(data, dict): + self._domains = {k.lower(): v for k, v in data.items()} + else: + self._domains = {} + elif self._domains: + self._domains = {} + self._last_mtime = 0.0 + except (OSError, json.JSONDecodeError): + pass + def _save(self) -> None: self.config_path.parent.mkdir(parents=True, exist_ok=True) with open(self.config_path, "w", encoding="utf-8") as f: json.dump(self._domains, f, indent=2) + self._last_mtime = self.config_path.stat().st_mtime def list_all(self) -> List[Dict[str, str]]: with self._lock: + self._maybe_reload() return [{"domain": d, "bucket": b} for d, b in self._domains.items()] def get_bucket(self, domain: str) -> Optional[str]: with self._lock: + self._maybe_reload() return self._domains.get(domain.lower()) + def get_domains_for_bucket(self, bucket: str) -> List[str]: + with self._lock: + self._maybe_reload() + return [d for d, b in self._domains.items() if b == bucket] + def set_mapping(self, domain: str, bucket: str) -> None: with self._lock: self._domains[domain.lower()] = bucket diff --git a/templates/bucket_detail.html b/templates/bucket_detail.html index 9a4b10e..14f3406 100644 --- a/templates/bucket_detail.html +++ b/templates/bucket_detail.html @@ -1020,6 +1020,28 @@ {% endif %} + {% if website_domains %} +
{{ domain }}
+ No domains mapped to this bucket. Manage domains
+