package main import ( "encoding/json" "log" "os" "path/filepath" "sync" ) type Config struct { Enabled bool `json:"enabled"` WAFURL string `json:"waf_url"` ReturnPort int `json:"return_port"` BackendURL string `json:"backend_url"` HealthInterval int `json:"health_interval"` TimeoutMs int `json:"timeout_ms"` } func configPath() string { exe, err := os.Executable() if err != nil { return "/opt/zoraxy/plugins/zoraxy-waf/waf_config.json" } return filepath.Join(filepath.Dir(exe), "waf_config.json") } var ( cfg Config cfgMu sync.RWMutex ) func defaultConfig() Config { return Config{ Enabled: false, WAFURL: "http://127.0.0.1:8080", ReturnPort: 8081, BackendURL: "http://127.0.0.1:80", HealthInterval: 5, TimeoutMs: 10000, } } func loadConfig() { cfgMu.Lock() defer cfgMu.Unlock() f, err := os.Open(configPath()) if err != nil { cfg = defaultConfig() return } defer f.Close() if err := json.NewDecoder(f).Decode(&cfg); err != nil { log.Printf("WARN: corrupt config, using defaults: %v", err) cfg = defaultConfig() } } func saveConfig() error { cfgMu.RLock() data, err := json.MarshalIndent(cfg, "", " ") cfgMu.RUnlock() if err != nil { return err } return os.WriteFile(configPath(), data, 0644) } func getConfig() Config { cfgMu.RLock() defer cfgMu.RUnlock() return cfg }