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