91 lines
1.9 KiB
Go
91 lines
1.9 KiB
Go
package routines
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/aceberg/WatchYourLAN/internal/arp"
|
|
"github.com/aceberg/WatchYourLAN/internal/check"
|
|
"github.com/aceberg/WatchYourLAN/internal/conf"
|
|
"github.com/aceberg/WatchYourLAN/internal/gdb"
|
|
"github.com/aceberg/WatchYourLAN/internal/influx"
|
|
"github.com/aceberg/WatchYourLAN/internal/models"
|
|
"github.com/aceberg/WatchYourLAN/internal/notify"
|
|
"github.com/aceberg/WatchYourLAN/internal/prometheus"
|
|
)
|
|
|
|
func startScan(quit chan bool) {
|
|
var lastDate, nowDate, plusDate time.Time
|
|
var foundHosts []models.Host
|
|
|
|
for {
|
|
select {
|
|
case <-quit:
|
|
return
|
|
default:
|
|
nowDate = time.Now()
|
|
plusDate = lastDate.Add(time.Duration(conf.AppConfig.Timeout) * time.Second)
|
|
|
|
if nowDate.After(plusDate) {
|
|
|
|
foundHosts = arp.Scan(conf.AppConfig.Ifaces, conf.AppConfig.ArpArgs, conf.AppConfig.ArpStrs)
|
|
|
|
// Make map of found hosts
|
|
foundHostsMap := make(map[string]models.Host)
|
|
for _, fHost := range foundHosts {
|
|
foundHostsMap[fHost.Mac] = fHost
|
|
}
|
|
|
|
compareHosts(foundHostsMap)
|
|
|
|
lastDate = time.Now()
|
|
}
|
|
|
|
time.Sleep(time.Duration(1) * time.Minute)
|
|
}
|
|
}
|
|
}
|
|
|
|
func compareHosts(foundHostsMap map[string]models.Host) {
|
|
|
|
allHosts, ok := gdb.Select("now")
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
for _, aHost := range allHosts {
|
|
|
|
fHost, exists := foundHostsMap[aHost.Mac]
|
|
if exists {
|
|
|
|
aHost.Iface = fHost.Iface
|
|
aHost.IP = fHost.IP
|
|
aHost.Date = fHost.Date
|
|
aHost.Now = 1
|
|
|
|
delete(foundHostsMap, aHost.Mac)
|
|
|
|
} else {
|
|
aHost.Now = 0
|
|
}
|
|
gdb.Update("now", aHost)
|
|
|
|
aHost.ID = 0
|
|
aHost.Date = time.Now().Format("2006-01-02 15:04:05")
|
|
gdb.Update("history", aHost)
|
|
|
|
if conf.AppConfig.InfluxEnable {
|
|
influx.Add(conf.AppConfig, aHost)
|
|
}
|
|
if conf.AppConfig.PrometheusEnable {
|
|
prometheus.Add(aHost)
|
|
}
|
|
}
|
|
|
|
for _, fHost := range foundHostsMap {
|
|
|
|
fHost.Name, fHost.DNS = check.DNS(fHost)
|
|
notify.Unknown(fHost) // Log and Shoutrrr
|
|
|
|
gdb.Update("now", fHost)
|
|
}
|
|
}
|