watchyourlan/internal/web/scan.go
2024-08-22 14:07:05 +07:00

80 lines
1.6 KiB
Go

package web
import (
// "log/slog"
"time"
"github.com/aceberg/WatchYourLAN/internal/arp"
"github.com/aceberg/WatchYourLAN/internal/db"
"github.com/aceberg/WatchYourLAN/internal/models"
)
func updateScan() {
db.Create(appConfig.DBPath)
allHosts = db.Select(appConfig.DBPath, "now")
histHosts = db.Select(appConfig.DBPath, "history")
quitScan = make(chan bool)
go startScan()
}
func startScan() {
var lastDate time.Time
for {
select {
case <-quitScan:
return
default:
nowDate := time.Now()
plusDate := lastDate.Add(time.Duration(appConfig.Timeout) * time.Second)
if nowDate.After(plusDate) {
foundHosts := arp.Scan(appConfig.Ifaces)
compareHosts(foundHosts)
allHosts = db.Select(appConfig.DBPath, "now")
histHosts = db.Select(appConfig.DBPath, "history")
lastDate = time.Now()
}
time.Sleep(time.Duration(1) * time.Second)
}
}
}
func compareHosts(foundHosts []models.Host) {
// Make map and Insert history
foundHostsMap := make(map[string]models.Host)
for _, fHost := range foundHosts {
foundHostsMap[fHost.Mac] = fHost
db.Insert(appConfig.DBPath, "history", fHost)
}
for _, aHost := range allHosts {
fHost, exists := foundHostsMap[aHost.Mac]
if exists && (appConfig.IgnoreIP == "yes" || aHost.IP == fHost.IP) {
aHost.Iface = fHost.Iface
aHost.IP = fHost.IP
aHost.Date = fHost.Date
aHost.Now = 1
delete(foundHostsMap, aHost.Mac)
} else {
aHost.Now = 0
}
db.Update(appConfig.DBPath, "now", aHost)
}
for _, fHost := range foundHostsMap {
// NOTIFY, LOG
db.Insert(appConfig.DBPath, "now", fHost)
}
}