package app import ( "encoding/json" "os" "path/filepath" ) func saveDNSUpstreamPoolFile(items []DNSUpstreamPoolItem) error { state := DNSUpstreamPoolState{Items: normalizeDNSUpstreamPoolItems(items)} if err := os.MkdirAll(filepath.Dir(dnsUpstreamPool), 0o755); err != nil { return err } tmp := dnsUpstreamPool + ".tmp" b, err := json.MarshalIndent(state, "", " ") if err != nil { return err } if err := os.WriteFile(tmp, b, 0o644); err != nil { return err } return os.Rename(tmp, dnsUpstreamPool) } func loadDNSUpstreamPoolState() []DNSUpstreamPoolItem { data, err := os.ReadFile(dnsUpstreamPool) if err == nil { var st DNSUpstreamPoolState if json.Unmarshal(data, &st) == nil { items := normalizeDNSUpstreamPoolItems(st.Items) if len(items) > 0 { return items } } } legacy := loadDNSUpstreamsConfFile() items := dnsUpstreamPoolFromLegacy(legacy) if len(items) > 0 { _ = saveDNSUpstreamPoolFile(items) } return items } func saveDNSUpstreamPoolState(items []DNSUpstreamPoolItem) error { items = normalizeDNSUpstreamPoolItems(items) if len(items) == 0 { items = dnsUpstreamPoolFromLegacy(loadDNSUpstreamsConfFile()) } if err := saveDNSUpstreamPoolFile(items); err != nil { return err } return saveDNSUpstreamsConfFile(dnsUpstreamPoolToLegacy(items)) }