Browse Source

增加文件变动更新

master
xyiege 7 months ago
parent
commit
56e3a1e743
  1. 49
      scagent/config/config.go
  2. 112
      scagent/core/Filemonitor.go
  3. 6
      scagent/go.mod
  4. 4
      scagent/go.sum

49
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
}
}

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

6
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
)

4
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=

Loading…
Cancel
Save