import os import yaml from ...models import DesiredRecord from ...normalizer import normalize_hostname, normalize_ipv4 class Plugin: name = "file" def __init__(self, config): self.config = config self.path = os.getenv("DNS_SYNC_FILE") if not self.path: raise RuntimeError("DNS_SYNC_FILE is required when PROXY=file") def discover(self): try: with open(self.path, "r", encoding="utf-8") as fh: data = yaml.safe_load(fh) except (OSError, yaml.YAMLError) as exc: raise RuntimeError(f"Could not read desired-state file {self.path}: {exc}") from exc if not isinstance(data, dict) or not isinstance(data.get("records"), dict): raise RuntimeError("Desired-state YAML must contain a top-level records mapping") result = [] for raw_hostname, raw_ip in data["records"].items(): hostname, wildcard = normalize_hostname(str(raw_hostname), allow_wildcard=True) result.append( DesiredRecord( hostname=hostname, ip=normalize_ipv4(str(raw_ip), hostname), wildcard=wildcard, source=self.name, ) ) return result