package initializer import ( "encoding/json" "fmt" "io" "net/http" "time" "github.com/wuko233/sysmonitord/internal/config" ) type ConfigLoader struct { client *http.Client } func NewConfigLoader() *ConfigLoader { return &ConfigLoader{ client: &http.Client{Timeout: 10 * time.Second}, } } func (l *ConfigLoader) Load(officialURL, UserURL string) (*config.OfficialConfig, *config.UserConfig, error) { var officialCfg config.OfficialConfig var userCfg config.UserConfig if err := l.fetchJSON(officialURL, &officialCfg); err != nil { return nil, nil, fmt.Errorf("加载官方配置失败: %v", err) } if err := l.fetchJSON(UserURL, &userCfg); err != nil { return nil, nil, fmt.Errorf("加载用户配置失败: %v", err) } return &officialCfg, &userCfg, nil } func (l *ConfigLoader) fetchJSON(url string, target interface{}) error { resp, err := l.client.Get(url) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("HTTP %s", resp.Status) } body, err := io.ReadAll(resp.Body) if err != nil { return err } return json.Unmarshal(body, target) } func determineServerURL(userCfg config.UserConfig) string { if userCfg.Connection.CenterServerURL != "" { return userCfg.Connection.CenterServerURL } // 默认地址 return "ws://localhost:8090/api/v1/ws" } func determineScanPaths(officialCfg config.OfficialConfig, userCfg config.UserConfig) []string { // 从用户配置获取扫描路径 if len(userCfg.ScanPaths) > 0 { return userCfg.ScanPaths } // 从官方配置获取扫描路径 if len(officialCfg.ScanPaths) > 0 { return officialCfg.ScanPaths } // 默认扫描路径 return []string{"/bin", "/sbin", "/usr/bin", "/usr/sbin", "/etc", "/tmp", "/home"} } func determineWatchPaths(official config.OfficialConfig, user config.UserConfig) []string { // 可复用扫描路径,或从 user.WatchPaths 读取 return determineScanPaths(official, user) }