diff --git a/internal/db/db-connect.go b/internal/db/db-connect.go index ee31fa7..242c2fa 100644 --- a/internal/db/db-connect.go +++ b/internal/db/db-connect.go @@ -2,11 +2,13 @@ package db import ( "database/sql" - + "log" + // Import sqlite module _ "modernc.org/sqlite" "github.com/aceberg/WatchYourLAN/internal/check" + "github.com/aceberg/WatchYourLAN/internal/models" ) func dbExec(path, sqlStatement string) { @@ -17,3 +19,30 @@ func dbExec(path, sqlStatement string) { _, err = db.Exec(sqlStatement) check.IfError(err) } + +func Select(path string) (dbHosts []models.Host) { + db, _ := sql.Open("sqlite", path) + defer db.Close() + + sqlStatement := `SELECT * FROM "now" ORDER BY DATE DESC` + + res, err := db.Query(sqlStatement) + if err != nil { + log.Fatal("ERROR: db_select: ", err) + } + + dbHosts = []models.Host{} + for res.Next() { + var oneHost models.Host + err = res.Scan(&oneHost.ID, &oneHost.Name, &oneHost.IP, &oneHost.Mac, &oneHost.Hw, &oneHost.Date, &oneHost.Known, &oneHost.Now) + if err != nil { + log.Fatal(err) + } + // oneHost.Name = unquote_str(oneHost.Name) + // oneHost.Hw = unquote_str(oneHost.Hw) + dbHosts = append(dbHosts, oneHost) + } + + //fmt.Println("Select all:", dbHosts) + return dbHosts +} diff --git a/internal/db/db-edit.go b/internal/db/db-edit.go index e2da0fa..1f9084e 100644 --- a/internal/db/db-edit.go +++ b/internal/db/db-edit.go @@ -25,3 +25,8 @@ func Create(path string) { log.Println("INFO: Table created!") } } + +func SetNow(path string) { + sqlStatement := `UPDATE "now" set NOW = '0';` + dbExec(path, sqlStatement) +} diff --git a/internal/scan/arpscan.go b/internal/scan/arpscan.go new file mode 100644 index 0000000..49b0261 --- /dev/null +++ b/internal/scan/arpscan.go @@ -0,0 +1,57 @@ +package scan + +import ( + "log" + "os/exec" + "strings" + "time" + + "github.com/aceberg/WatchYourLAN/internal/models" +) + +func scanIface(iface string) string { + cmd, err := exec.Command("arp-scan", "-glNx", "-I", iface).Output() + if err != nil { + return string("") + } + return string(cmd) +} + +func parseOutput(text string) []models.Host { + var foundHosts = []models.Host{} + + perString := strings.Split(text, "\n") + currentTime := time.Now() + + for _, host := range perString { + if host != "" { + var oneHost models.Host + p := strings.Split(host, " ") + oneHost.IP = p[0] + oneHost.Mac = p[1] + oneHost.Hw = p[2] + oneHost.Date = currentTime.Format("2006-01-02 15:04:05") + oneHost.Now = 1 + foundHosts = append(foundHosts, oneHost) + } + } + + return foundHosts +} + +// Scan all interfaces +func arpScan(allIfaces string) []models.Host { + var text string + var foundHosts = []models.Host{} + + perString := strings.Split(allIfaces, " ") + + for _, iface := range perString { + log.Println("INFO: scanning interface", iface) + text = scanIface(iface) + log.Println("INFO: found IPs:", text) + foundHosts = append(foundHosts, parseOutput(text)...) + } + + return foundHosts +} diff --git a/internal/scan/compare.go b/internal/scan/compare.go new file mode 100644 index 0000000..73da000 --- /dev/null +++ b/internal/scan/compare.go @@ -0,0 +1,33 @@ +package scan + +import ( + // "fmt" + "log" + + "github.com/aceberg/WatchYourLAN/internal/models" +) + +// func host_in_db(host Host, dbHosts []Host) bool { // Check if host is already in DB +// for _, oneHost := range dbHosts { +// if host.Ip == oneHost.Ip && host.Mac == oneHost.Mac && host.Hw == oneHost.Hw { +// oneHost.Date = host.Date +// oneHost.Now = 1 +// db_update(oneHost) +// return true +// } +// } +// return false +// } + +func hostsCompare(foundHosts []models.Host, dbHosts []models.Host) { + for _, oneHost := range foundHosts { + // if !(host_in_db(oneHost, dbHosts)) { + // oneHost.Now = 1 // Mark host online + // msg := fmt.Sprintf("UNKNOWN HOST IP: '%s', MAC: '%s', Hw: '%s'", oneHost.Ip, oneHost.Mac, oneHost.Hw) + // log.Println("WARN:", msg) + // shoutr_notify(msg) // Notify through Shoutrrr + // db_insert(oneHost) + // } + log.Println("FOUND:", oneHost) + } +} diff --git a/internal/scan/start.go b/internal/scan/start.go new file mode 100644 index 0000000..f962291 --- /dev/null +++ b/internal/scan/start.go @@ -0,0 +1,21 @@ +package scan + +import ( + "time" + + "github.com/aceberg/WatchYourLAN/internal/db" + "github.com/aceberg/WatchYourLAN/internal/models" +) + +func Start(appConfig models.Conf) { + var foundHosts []models.Host + var dbHosts []models.Host + for { // Endless + foundHosts = arpScan(appConfig.Iface) // Scan interfaces + dbHosts = db.Select(appConfig.DbPath) // Select everything from DB + db.SetNow(appConfig.DbPath) // Mark hosts in DB as offline + hostsCompare(foundHosts, dbHosts) // Compare hosts online and in DB + // and add them to DB + time.Sleep(time.Duration(appConfig.Timeout) * time.Second) // Timeout + } +} diff --git a/internal/web/index.go b/internal/web/index.go index 1e02e23..48a1037 100644 --- a/internal/web/index.go +++ b/internal/web/index.go @@ -11,8 +11,9 @@ import ( func index(w http.ResponseWriter, r *http.Request) { var guiData models.GuiData + guiData.Config = AppConfig - guiData.Hosts = []models.Host{} + guiData.Hosts = AllHosts guiData.Icon = Icon tmpl, _ := template.ParseFiles(TemplPath+"index.html", TemplPath+"header.html", TemplPath+"footer.html") diff --git a/internal/web/templates/index.html b/internal/web/templates/index.html index df23e2f..03cb5ea 100644 --- a/internal/web/templates/index.html +++ b/internal/web/templates/index.html @@ -9,7 +9,7 @@
| Name | -Ip | +IP | Mac | Hardware | Known | @@ -18,7 +18,7 @@ {{ if eq .Now 1 }}
|---|---|---|---|---|---|
| {{ .Name }} | -{{ .Ip }} | +{{ .IP }} | {{ .Mac }} | {{ .Hw }} | @@ -44,12 +44,12 @@ |