自动更新管控端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

112 lines
2.7 KiB

package core
import (
"fmt"
"os"
"path/filepath"
"scagent/config"
"scagent/util"
"github.com/fsnotify/fsnotify"
"go.uber.org/zap"
)
// 文件变动监控
func FileMonitor() {
// 日志
logger := util.NewProductionLogger()
defer logger.Sync()
// 确保监控目录存在
if err := ensureDirExists(config.G.FilePath); err != nil {
logger.Error("无法确保监控目录存在", zap.Error(err))
}
// 创建监控器
watcher, err := fsnotify.NewWatcher()
if err != nil {
logger.Error("无法创建监控器", zap.Error(err))
}
defer watcher.Close()
// 添加要监控的目录及其子目录
if err := addDirsToWatcher(watcher, config.G.FilePath); err != nil {
logger.Error("无法添加目录到监控器", zap.Error(err))
}
// 启动事件处理循环
done := make(chan bool)
go func() {
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
// 处理事件
eventType := getEventType(event)
msg := fmt.Sprintf("检测到变化: %s %s", eventType, event.Name)
logger.Info(msg)
// 发送信息到客服
// 如果是新目录,添加到监控器
if event.Op&fsnotify.Create == fsnotify.Create {
if fi, err := os.Stat(event.Name); err == nil && fi.IsDir() {
// log.Printf("添加新目录到监控: %s", event.Name)
msg := fmt.Sprintf("添加新目录到监控: %s", event.Name)
logger.Info(msg)
// 发送到客户端
addDirsToWatcher(watcher, event.Name)
}
}
case err, ok := <-watcher.Errors:
if !ok {
return
}
logger.Error("监控错误", zap.Error(err))
}
}
}()
// 打印监控目录
logger.Info("监控目录", zap.String("dir", config.G.FilePath))
<-done
}
// 确保目录存在,如果不存在则创建
func ensureDirExists(dir string) error {
if _, err := os.Stat(dir); os.IsNotExist(err) {
return os.MkdirAll(dir, 0755)
}
return nil
}
// 将目录及其子目录添加到监控器
func addDirsToWatcher(watcher *fsnotify.Watcher, dir string) error {
return filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
return watcher.Add(path)
}
return nil
})
}
// 获取事件类型描述
func getEventType(event fsnotify.Event) string {
switch {
case event.Op&fsnotify.Create == fsnotify.Create:
return "创建了"
case event.Op&fsnotify.Write == fsnotify.Write:
return "修改了"
case event.Op&fsnotify.Remove == fsnotify.Remove:
return "删除了"
case event.Op&fsnotify.Rename == fsnotify.Rename:
return "重命名了"
case event.Op&fsnotify.Chmod == fsnotify.Chmod:
return "修改了权限"
default:
return "发生了变化"
}
}