This repository has been archived on 2026-03-28. You can view files and clone it, but cannot push or open issues or pull requests.
old-sysmonitord/internal/initializer/runtime.go

141 lines
3.4 KiB
Go

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("[进程] 已成功停止,安全退出程序。")
}