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
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 "发生了变化"
|
|
}
|
|
}
|
|
|