package app import ( "encoding/json" "os" "path/filepath" dnscfgpkg "selective-vpn-api/app/dnscfg" ) func loadDNSUpstreamsConfFile() DNSUpstreams { data, err := os.ReadFile(dnsUpstreamsConf) if err != nil { return dnscfgUpstreamsToApp(dnscfgLegacyDefaults()) } pkgCfg := dnscfgpkg.ParseUpstreamsConf(string(data), dnscfgLegacyDefaults(), normalizeDNSUpstream) return dnscfgUpstreamsToApp(pkgCfg) } func saveDNSUpstreamsConfFile(cfg DNSUpstreams) error { pkgCfg := dnscfgpkg.NormalizeUpstreams(dnscfgUpstreamsFromApp(cfg), dnscfgLegacyDefaults(), normalizeDNSUpstream) cfg = dnscfgUpstreamsToApp(pkgCfg) content := dnscfgpkg.RenderUpstreamsConf(pkgCfg) if err := os.MkdirAll(filepath.Dir(dnsUpstreamsConf), 0o755); err != nil { return err } tmp := dnsUpstreamsConf + ".tmp" if err := os.WriteFile(tmp, []byte(content), 0o644); err != nil { return err } if err := os.Rename(tmp, dnsUpstreamsConf); err != nil { return err } // Legacy JSON mirror for backward compatibility with older UI/runtime bits. _ = os.MkdirAll(stateDir, 0o755) if b, err := json.MarshalIndent(cfg, "", " "); err == nil { _ = os.WriteFile(dnsUpstreamsPath, b, 0o644) } return nil }