4 changed files with 170 additions and 1 deletions
@ -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 |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -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 "发生了变化" |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue