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