Add FirstSeen attribute

This commit is contained in:
David Chidell 2024-11-13 00:49:54 +00:00
parent 9c7809a513
commit e35cdcb618
6 changed files with 42 additions and 32 deletions

View file

@ -10,30 +10,32 @@ import (
func Create() { func Create() {
sqlStatement := `CREATE TABLE IF NOT EXISTS "now" ( sqlStatement := `CREATE TABLE IF NOT EXISTS "now" (
"ID" ` + currentDB.PrimaryKey + `, "ID" ` + currentDB.PrimaryKey + `,
"NAME" TEXT NOT NULL, "NAME" TEXT NOT NULL,
"DNS" TEXT NOT NULL, "DNS" TEXT NOT NULL,
"IFACE" TEXT, "IFACE" TEXT,
"IP" TEXT, "IP" TEXT,
"MAC" TEXT, "MAC" TEXT,
"HW" TEXT, "HW" TEXT,
"DATE" TEXT, "DATE" TEXT,
"KNOWN" INTEGER DEFAULT 0, "FIRSTSEEN" TEXT,
"NOW" INTEGER DEFAULT 0 "KNOWN" INTEGER DEFAULT 0,
"NOW" INTEGER DEFAULT 0
);` );`
dbExec(sqlStatement) dbExec(sqlStatement)
sqlStatement = `CREATE TABLE IF NOT EXISTS "history" ( sqlStatement = `CREATE TABLE IF NOT EXISTS "history" (
"ID" ` + currentDB.PrimaryKey + `, "ID" ` + currentDB.PrimaryKey + `,
"NAME" TEXT NOT NULL, "NAME" TEXT NOT NULL,
"DNS" TEXT NOT NULL, "DNS" TEXT NOT NULL,
"IFACE" TEXT, "IFACE" TEXT,
"IP" TEXT, "IP" TEXT,
"MAC" TEXT, "MAC" TEXT,
"HW" TEXT, "HW" TEXT,
"DATE" TEXT, "DATE" TEXT,
"KNOWN" INTEGER DEFAULT 0, "FIRSTSEEN" TEXT,
"NOW" INTEGER DEFAULT 0 "KNOWN" INTEGER DEFAULT 0,
"NOW" INTEGER DEFAULT 0
);` );`
dbExec(sqlStatement) dbExec(sqlStatement)
} }
@ -42,8 +44,8 @@ func Create() {
func Insert(table string, oneHost models.Host) { func Insert(table string, oneHost models.Host) {
oneHost.Name = quoteStr(oneHost.Name) oneHost.Name = quoteStr(oneHost.Name)
oneHost.Hw = quoteStr(oneHost.Hw) oneHost.Hw = quoteStr(oneHost.Hw)
sqlStatement := `INSERT INTO %s ("NAME", "DNS", "IFACE", "IP", "MAC", "HW", "DATE", "KNOWN", "NOW") VALUES ('%s','%s','%s','%s','%s','%s','%s','%d','%d');` sqlStatement := `INSERT INTO %s ("NAME", "DNS", "IFACE", "IP", "MAC", "HW", "DATE", "FIRSTSEEN", "KNOWN", "NOW") VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%d','%d');`
sqlStatement = fmt.Sprintf(sqlStatement, table, oneHost.Name, oneHost.DNS, oneHost.Iface, oneHost.IP, oneHost.Mac, oneHost.Hw, oneHost.Date, oneHost.Known, oneHost.Now) sqlStatement = fmt.Sprintf(sqlStatement, table, oneHost.Name, oneHost.DNS, oneHost.Iface, oneHost.IP, oneHost.Mac, oneHost.Hw, oneHost.Date, oneHost.FirstSeen, oneHost.Known, oneHost.Now)
dbExec(sqlStatement) dbExec(sqlStatement)
} }

View file

@ -32,16 +32,17 @@ type Conf struct {
// Host - one host // Host - one host
type Host struct { type Host struct {
ID int `db:"ID"` ID int `db:"ID"`
Name string `db:"NAME"` Name string `db:"NAME"`
DNS string `db:"DNS"` DNS string `db:"DNS"`
Iface string `db:"IFACE"` Iface string `db:"IFACE"`
IP string `db:"IP"` IP string `db:"IP"`
Mac string `db:"MAC"` Mac string `db:"MAC"`
Hw string `db:"HW"` Hw string `db:"HW"`
Date string `db:"DATE"` Date string `db:"DATE"`
Known int `db:"KNOWN"` FirstSeen string `db:"FIRSTSEEN"`
Now int `db:"NOW"` Known int `db:"KNOWN"`
Now int `db:"NOW"`
} }
// Stat - status // Stat - status

View file

@ -31,6 +31,7 @@ function createHTML(addr, i) {
<td><a href="/host/${addr.ID}">${addr.Mac}</a></td> <td><a href="/host/${addr.ID}">${addr.Mac}</a></td>
<td>${addr.Hw}</td> <td>${addr.Hw}</td>
<td>${addr.Date}</td> <td>${addr.Date}</td>
<td>${addr.FirstSeen}</td>
<td> <td>
<div class="form-check form-switch"> <div class="form-check form-switch">
<input onclick="editForm(${addr.ID}, 'toggle')" class="form-check-input" type="checkbox" ${known}> <input onclick="editForm(${addr.ID}, 'toggle')" class="form-check-input" type="checkbox" ${known}>

View file

@ -76,6 +76,7 @@ func compareHosts(foundHosts []models.Host) {
for _, fHost := range foundHostsMap { for _, fHost := range foundHostsMap {
fHost.Name, fHost.DNS = updateDNS(fHost) fHost.Name, fHost.DNS = updateDNS(fHost)
fHost.FirstSeen = time.Now().Format("2006-01-02 15:04:05")
msg := fmt.Sprintf("WatchYourLAN: unknown host found. Names: '%s', IP: '%s', MAC: '%s', Hw: '%s', Iface: '%s'", fHost.DNS, fHost.IP, fHost.Mac, fHost.Hw, fHost.Iface) msg := fmt.Sprintf("WatchYourLAN: unknown host found. Names: '%s', IP: '%s', MAC: '%s', Hw: '%s', Iface: '%s'", fHost.DNS, fHost.IP, fHost.Mac, fHost.Hw, fHost.Iface)
slog.Warn(msg) slog.Warn(msg)

View file

@ -40,6 +40,10 @@
<td>Date</td> <td>Date</td>
<td>{{ .Host.Date }}</td> <td>{{ .Host.Date }}</td>
</tr> </tr>
<tr>
<td>First Seen</td>
<td>{{ .Host.FirstSeen }}</td>
</tr>
<tr> <tr>
<td>Known</td> <td>Known</td>
<td>{{ if eq .Host.Known 1 }}Yes{{ else }}No{{ end }}</td> <td>{{ if eq .Host.Known 1 }}Yes{{ else }}No{{ end }}</td>

View file

@ -53,6 +53,7 @@
<th>MAC <i class="bi bi-sort-down-alt my-btn" onclick="sortBy('Mac')"></i></th> <th>MAC <i class="bi bi-sort-down-alt my-btn" onclick="sortBy('Mac')"></i></th>
<th>Hardware <i class="bi bi-sort-down-alt my-btn" onclick="sortBy('Hw')"></i></th> <th>Hardware <i class="bi bi-sort-down-alt my-btn" onclick="sortBy('Hw')"></i></th>
<th>Date <i class="bi bi-sort-down-alt my-btn" onclick="sortBy('Date')"></i></th> <th>Date <i class="bi bi-sort-down-alt my-btn" onclick="sortBy('Date')"></i></th>
<th>First Seen <i class="bi bi-sort-down-alt my-btn" onclick="sortBy('FirstSeen')"></i></th>
<th>Known <i class="bi bi-sort-down-alt my-btn" onclick="sortBy('Known')"></i></th> <th>Known <i class="bi bi-sort-down-alt my-btn" onclick="sortBy('Known')"></i></th>
<th>Online <i class="bi bi-sort-down-alt my-btn" onclick="sortBy('Now')"></i></th> <th>Online <i class="bi bi-sort-down-alt my-btn" onclick="sortBy('Now')"></i></th>
</thead> </thead>