diff --git a/scagent/config/config.go b/scagent/config/config.go new file mode 100644 index 0000000..90b42f6 --- /dev/null +++ b/scagent/config/config.go @@ -0,0 +1,49 @@ +package config + +import ( + "fmt" + "net" +) + +type Config struct { + DeviceName string + Port string + LocalIP string + FilePath string + Version string +} + +var G Config + +// 本地ip +func GetLocalIP() (string, error) { + addrs, err := net.InterfaceAddrs() + if err != nil { + return "", err + } + var ips []string + for _, address := range addrs { + if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + if ipnet.IP.To4() != nil { + ips = append(ips, ipnet.IP.String()) + } + } + } + if len(ips) == 0 { + return "", fmt.Errorf("get local ip failed") + } else if len(ips) == 1 { + return ips[0], nil + } else { + // Select the one connected to the network + // when there are multiple network interfaces + + // Is there a better way? + c, err := net.Dial("udp", "8.8.8.8:80") + if err != nil { + return ips[0], nil + } + defer c.Close() + return c.LocalAddr().(*net.UDPAddr).IP.String(), nil + } + +} diff --git a/scagent/core/Filemonitor.go b/scagent/core/Filemonitor.go new file mode 100644 index 0000000..e719a83 --- /dev/null +++ b/scagent/core/Filemonitor.go @@ -0,0 +1,112 @@ +package core + +import ( + "fmt" + "os" + "path/filepath" + "scagnet/config" + "scagnet/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 "发生了变化" + } +} diff --git a/scagent/go.mod b/scagent/go.mod index 61c34bf..57abe31 100644 --- a/scagent/go.mod +++ b/scagent/go.mod @@ -3,8 +3,12 @@ module scagnet go 1.22.1 require ( + github.com/fsnotify/fsnotify v1.9.0 go.uber.org/zap v1.27.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) -require go.uber.org/multierr v1.10.0 // indirect +require ( + go.uber.org/multierr v1.10.0 // indirect + golang.org/x/sys v0.13.0 // indirect +) diff --git a/scagent/go.sum b/scagent/go.sum index 853bbba..3ddb190 100644 --- a/scagent/go.sum +++ b/scagent/go.sum @@ -1,5 +1,7 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= @@ -10,6 +12,8 @@ go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=