85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
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)
|
|
}
|