package app import ( "fmt" "io/fs" "os" ) // --------------------------------------------------------------------- // seed-файлы и bootstrap // --------------------------------------------------------------------- // EN: Bootstrap seed files on first run so the API can start with sane defaults // EN: even when runtime configuration files do not exist yet. // RU: Инициализация seed-файлов при первом запуске, чтобы API стартовал // RU: с корректными значениями по умолчанию при отсутствии runtime-конфигов. // --------------------------------------------------------------------- // seed initializer // --------------------------------------------------------------------- func ensureSeeds() { _ = os.MkdirAll(domainDir, 0o755) _ = os.MkdirAll("/etc/selective-vpn", 0o755) _ = os.MkdirAll(stateDir, 0o755) seedFile := func(name string, path string) { if _, err := os.Stat(path); err == nil { return } data, err := fs.ReadFile(embeddedDomains, "assets/domains/"+name) if err != nil { data = []byte{} } _ = os.WriteFile(path, data, 0o644) } seedFile("bases.txt", domainDir+"/bases.txt") seedFile("subs.txt", domainDir+"/subs.txt") seedFile("meta-special.txt", domainDir+"/meta-special.txt") seedFile("static-ips.txt", staticIPsFile) if _, err := os.Stat(dnsUpstreamsConf); err != nil { content := fmt.Sprintf("default %s %s\nmeta %s %s\n", defaultDNS1, defaultDNS2, defaultMeta1, defaultMeta2) _ = os.WriteFile(dnsUpstreamsConf, []byte(content), 0o644) } }