package initializer import ( "log" "time" "github.com/wuko233/sysmonitord/internal/config" "github.com/wuko233/sysmonitord/internal/monitor" "github.com/wuko233/sysmonitord/internal/network" "github.com/wuko233/sysmonitord/internal/scanner" "github.com/wuko233/sysmonitord/internal/whitelist" ) type Runtime struct { officialCfg config.OfficialConfig userCfg config.UserConfig centerCil *network.WSClient auditCil *network.WSClient scanner *scanner.Scanner watcher *scanner.Watcher sshMon *monitor.SSHMonitor infoMon *monitor.InfoMonitor } func NewRuntime(official config.OfficialConfig, user config.UserConfig) *Runtime { return &Runtime{ officialCfg: official, userCfg: user, } } func (r *Runtime) Start() error { // 初始化白名单引擎 log.Println("[初始化]: 初始化白名单判定引擎...") wlManager := whitelist.NewManager(r.officialCfg, r.userCfg) // WebSocket客户端 log.Println("[初始化]: 启动中心服务器连接...") centerURL := determineServerURL(r.userCfg) r.centerCil = network.NewWSClient(network.ClientConfig{ ServerURL: centerURL, SendInterval: 1 * time.Second, BufferSize: 1000, }) r.centerCil.Start() auditURL := wlManager.GetAuditServerUrl() if auditURL == "" { auditURL = centerURL } r.auditCil = network.NewWSClient(network.ClientConfig{ ServerURL: auditURL, SendInterval: 1 * time.Second, BufferSize: 1000, }) r.auditCil.Start() // 文件扫描器 if r.userCfg.Modules.FileScanner { r.scanner = scanner.NewScanner(wlManager, r.centerCil, determineScanPaths(r.officialCfg, r.userCfg)) r.scanner.Start() log.Printf("[初始化]: 文件周期扫描器已启动") } // 文件监控器 if r.userCfg.Modules.FileWatcher { var err error r.watcher, err = scanner.NewWatcher(wlManager, r.centerCil, determineWatchPaths(r.officialCfg, r.userCfg)) if err != nil { return err } r.watcher.Start() log.Printf("[初始化]: 文件监控已启动") } // SSH监控器 if r.userCfg.Modules.SSHMonitor { sshAlertChan := make(chan monitor.Alert, 100) r.sshMon = monitor.NewSSHMonitor(&r.userCfg.MonitorConfig.SSHMonitorConfig, sshAlertChan) go func() { for alert := range sshAlertChan { packet := network.NewPacket("SSH_ALERT", alert) r.auditCil.SendQueue(packet) } }() go func() { if err := r.sshMon.Start(); err != nil { log.Printf("[错误] SSH监控遇到错误: %v", err) } log.Printf("[初始化] SSH监控已启动") }() } // 系统信息监控器 if r.userCfg.Modules.SystemMonitor { metricsChan := make(chan monitor.ServerMetrics, 100) SystemMonitorCfg := &r.userCfg.MonitorConfig.SystemMonitorConfig r.infoMon = monitor.NewInfoMonitor(SystemMonitorCfg, metricsChan) go func() { for metrics := range metricsChan { packet := network.NewPacket("STATUS_UPDATE", metrics) r.centerCil.SendQueue(packet) } }() go r.infoMon.Start() log.Printf("[初始化] 系统状态监控已启动") } return nil } func (r *Runtime) Stop() { log.Println("[进程]接收到停止信号,正在关闭...") if r.watcher != nil { r.watcher.Stop() } if r.scanner != nil { r.scanner.Stop() } if r.sshMon != nil { r.sshMon.Stop() } if r.infoMon != nil { r.infoMon.Stop() } if r.centerCil != nil { r.centerCil.Stop() } if r.auditCil != nil { r.auditCil.Stop() } log.Println("[进程] 已成功停止,安全退出程序。") }