watchyourlan/backend/internal/arp/arpscan.go
2025-09-05 06:10:16 +07:00

98 lines
1.9 KiB
Go

package arp
import (
"log/slog"
"os/exec"
"strings"
"time"
"github.com/aceberg/WatchYourLAN/internal/check"
"github.com/aceberg/WatchYourLAN/internal/models"
)
var arpArgs string
func scanIface(iface string) string {
var cmd *exec.Cmd
if arpArgs != "" {
cmd = exec.Command("arp-scan", "-glNx", arpArgs, "-I", iface)
} else {
cmd = exec.Command("arp-scan", "-glNx", "-I", iface)
}
out, err := cmd.Output()
slog.Debug(cmd.String())
if check.IfError(err) {
return string("")
}
return string(out)
}
func scanStr(str string) string {
args := strings.Split(str, " ")
cmd := exec.Command("arp-scan", args...)
out, err := cmd.Output()
slog.Debug(cmd.String())
if check.IfError(err) {
return string("")
}
return string(out)
}
func parseOutput(text, iface string) []models.Host {
var foundHosts = []models.Host{}
p := strings.Split(text, "\n")
for _, host := range p {
if host != "" {
var oneHost models.Host
p := strings.Split(host, " ")
oneHost.Iface = iface
oneHost.IP = p[0]
oneHost.Mac = p[1]
oneHost.Hw = p[2]
oneHost.Date = time.Now().Format("2006-01-02 15:04:05")
oneHost.Now = 1
foundHosts = append(foundHosts, oneHost)
}
}
return foundHosts
}
// Scan all interfaces
func Scan(ifaces, args string, strs []string) []models.Host {
var text string
var p []string
var foundHosts = []models.Host{}
arpArgs = args
if ifaces != "" {
p = strings.Split(ifaces, " ")
for _, iface := range p {
slog.Debug("Scanning interface " + iface)
text = scanIface(iface)
slog.Debug("Found IPs: \n" + text)
foundHosts = append(foundHosts, parseOutput(text, iface)...)
}
}
for _, s := range strs {
slog.Debug("Scanning string " + s)
text = scanStr(s)
slog.Debug("Found IPs: \n" + text)
p = strings.Split(s, " ")
foundHosts = append(foundHosts, parseOutput(text, p[len(p)-1])...)
}
return foundHosts
}