History in DB switch

This commit is contained in:
aceberg 2024-08-30 00:09:33 +07:00
parent eaa0c27bd7
commit 0187d9b1bb
8 changed files with 59 additions and 13 deletions

View file

@ -20,6 +20,7 @@ func Get(path string) (config models.Conf) {
viper.SetDefault("IFACES", "") viper.SetDefault("IFACES", "")
viper.SetDefault("TIMEOUT", 120) viper.SetDefault("TIMEOUT", 120)
viper.SetDefault("TRIM_HIST", 48) viper.SetDefault("TRIM_HIST", 48)
viper.SetDefault("HIST_IN_DB", false)
viper.SetDefault("SHOUTRRR_URL", "") viper.SetDefault("SHOUTRRR_URL", "")
viper.SetDefault("USE_DB", "sqlite") viper.SetDefault("USE_DB", "sqlite")
@ -44,6 +45,7 @@ func Get(path string) (config models.Conf) {
config.Ifaces = viper.Get("IFACES").(string) config.Ifaces = viper.Get("IFACES").(string)
config.Timeout = viper.GetInt("TIMEOUT") config.Timeout = viper.GetInt("TIMEOUT")
config.TrimHist = viper.GetInt("TRIM_HIST") config.TrimHist = viper.GetInt("TRIM_HIST")
config.HistInDB = viper.GetBool("HIST_IN_DB")
config.ShoutURL = viper.Get("SHOUTRRR_URL").(string) config.ShoutURL = viper.Get("SHOUTRRR_URL").(string)
config.UseDB = viper.Get("USE_DB").(string) config.UseDB = viper.Get("USE_DB").(string)
@ -75,6 +77,7 @@ func Write(config models.Conf) {
viper.Set("IFACES", config.Ifaces) viper.Set("IFACES", config.Ifaces)
viper.Set("TIMEOUT", config.Timeout) viper.Set("TIMEOUT", config.Timeout)
viper.Set("TRIM_HIST", config.TrimHist) viper.Set("TRIM_HIST", config.TrimHist)
viper.Set("HIST_IN_DB", config.HistInDB)
viper.Set("SHOUTRRR_URL", config.ShoutURL) viper.Set("SHOUTRRR_URL", config.ShoutURL)
viper.Set("USE_DB", config.UseDB) viper.Set("USE_DB", config.UseDB)

View file

@ -15,6 +15,7 @@ type Conf struct {
ArpArgs string ArpArgs string
Timeout int Timeout int
TrimHist int TrimHist int
HistInDB bool
ShoutURL string ShoutURL string
// PostgreSQL // PostgreSQL
UseDB string UseDB string

View file

@ -21,7 +21,9 @@ func apiAll(c *gin.Context) {
func apiHistory(c *gin.Context) { func apiHistory(c *gin.Context) {
var hosts []models.Host var hosts []models.Host
histHosts := db.Select("history") if appConfig.HistInDB {
histHosts = db.Select("history")
}
mac := c.Param("mac") mac := c.Param("mac")

View file

@ -58,6 +58,13 @@ func saveSettingsHandler(c *gin.Context) {
appConfig.Timeout, _ = strconv.Atoi(timeout) appConfig.Timeout, _ = strconv.Atoi(timeout)
appConfig.TrimHist, _ = strconv.Atoi(trimHist) appConfig.TrimHist, _ = strconv.Atoi(trimHist)
histdb := c.PostForm("histdb")
if histdb == "on" {
appConfig.HistInDB = true
} else {
appConfig.HistInDB = false
}
conf.Write(appConfig) conf.Write(appConfig)
slog.Info("Writing new config to " + appConfig.ConfPath) slog.Info("Writing new config to " + appConfig.ConfPath)

View file

@ -10,8 +10,8 @@ var (
// appConfig - config for Web Gui // appConfig - config for Web Gui
appConfig models.Conf appConfig models.Conf
allHosts []models.Host allHosts []models.Host
// histHosts []models.Host histHosts []models.Host
quitScan chan bool quitScan chan bool
) )

View file

@ -64,7 +64,10 @@ func compareHosts(foundHosts []models.Host) {
db.Update("now", aHost) db.Update("now", aHost)
aHost.Date = time.Now().Format("2006-01-02 15:04:05") aHost.Date = time.Now().Format("2006-01-02 15:04:05")
db.Insert("history", aHost) histHosts = append(histHosts, aHost)
if appConfig.HistInDB {
db.Insert("history", aHost)
}
if appConfig.InfluxEnable { if appConfig.InfluxEnable {
influx.Add(appConfig, aHost) influx.Add(appConfig, aHost)
} }

View file

@ -70,10 +70,6 @@
<td>Args for arp-scan</td> <td>Args for arp-scan</td>
<td><input name="arpargs" type="text" class="form-control" value="{{ .Config.ArpArgs }}"></td> <td><input name="arpargs" type="text" class="form-control" value="{{ .Config.ArpArgs }}"></td>
</tr> </tr>
<tr>
<td>Trim History (hours)</td>
<td><input name="trim" type="number" class="form-control" value="{{ .Config.TrimHist }}"></td>
</tr>
<tr> <tr>
<td>Log level</td> <td>Log level</td>
<td><select name="log" class="form-select"> <td><select name="log" class="form-select">
@ -84,6 +80,22 @@
<option value="error">error</option> <option value="error">error</option>
</select></td> </select></td>
</tr> </tr>
<tr>
<td>Trim History (hours)</td>
<td><input name="trim" type="number" class="form-control" value="{{ .Config.TrimHist }}"></td>
</tr>
<tr>
<td>Store History in DB</td>
<td>
<div class="form-check form-switch">
{{ if .Config.HistInDB }}
<input class="form-check-input" type="checkbox" name="histdb" checked>
{{ else }}
<input class="form-check-input" type="checkbox" name="histdb">
{{ end }}
</div>
</td>
</tr>
<tr> <tr>
<td>Use DB</td> <td>Use DB</td>
<td><select name="usedb" class="form-select"> <td><select name="usedb" class="form-select">
@ -173,10 +185,11 @@
<p><b>Interfaces</b> - one or more, space separated</p> <p><b>Interfaces</b> - one or more, space separated</p>
<p><b>Timeout (seconds)</b> - time between scans</p> <p><b>Timeout (seconds)</b> - time between scans</p>
<p><b>Args for arp-scan</b> - pass your own arguments to <code>arp-scan</code>. See <code>man arp-scan</code> for more. Enable <b>debug</b> log level to see resulting command. (Example: <code>-r 1</code>)</p> <p><b>Args for arp-scan</b> - pass your own arguments to <code>arp-scan</code>. See <code>man arp-scan</code> for more. Enable <b>debug</b> log level to see resulting command. (Example: <code>-r 1</code>)</p>
<p><b>Trim History (hours)</b> - remove history after</p> <p><b>Trim History</b> - remove history after (hours)</p>
<p><b>Store History in DB</b> - if off, the History will be stored only in memory and will be lost on app restart. Though, it will keep the app DB smaller and InfluxDB is recommended for long term History storage</p>
<p><b>PG Connect URL</b> - address to connect to PostgreSQL DB. (Example: <code>postgres://username:password@192.168.0.1:5432/dbname?sslmode=disable</code>). Full list of URL parameters <a href="https://pkg.go.dev/github.com/lib/pq#hdr-Connection_String_Parameters" target="_blank">here</a></p> <p><b>PG Connect URL</b> - address to connect to PostgreSQL DB. (Example: <code>postgres://username:password@192.168.0.1:5432/dbname?sslmode=disable</code>). Full list of URL parameters <a href="https://pkg.go.dev/github.com/lib/pq#hdr-Connection_String_Parameters" target="_blank">here</a></p>
<p>● If you find this app useful, please, <a href="https://github.com/aceberg#donate" target="_blank">donate</a></p> <p>● If you find this app useful, please, <a href="https://github.com/aceberg#donate" target="_blank">donate</a></p>
<p>● Commission you own app (Golang, HTML/JS). Contact <a href="https://github.com/aceberg" target="_blank">here</a></p> <p>● Commission you own app (Golang, HTML/JS, Flutter). Contact <a href="https://github.com/aceberg" target="_blank">here</a></p>
</div> </div>
</div> </div>
</div> </div>

View file

@ -5,6 +5,7 @@ import (
"time" "time"
"github.com/aceberg/WatchYourLAN/internal/db" "github.com/aceberg/WatchYourLAN/internal/db"
"github.com/aceberg/WatchYourLAN/internal/models"
) )
func trimHistoryRoutine() { func trimHistoryRoutine() {
@ -24,19 +25,35 @@ func trimHistory() {
now, _ := time.Parse("2006-01-02 15:04:05", nowStr) // in one format now, _ := time.Parse("2006-01-02 15:04:05", nowStr) // in one format
nowMinus := now.Add(-time.Duration(hours) * time.Hour) nowMinus := now.Add(-time.Duration(hours) * time.Hour)
history := db.Select("history") history := histHosts
if appConfig.HistInDB {
history = db.Select("history")
}
slog.Info("Removing all History before", "date", nowMinus.Format("2006-01-02 15:04:05")) slog.Info("Removing all History before", "date", nowMinus.Format("2006-01-02 15:04:05"))
n := 0 n := 0
for _, hist := range history { for i, hist := range history {
date, _ := time.Parse("2006-01-02 15:04:05", hist.Date) date, _ := time.Parse("2006-01-02 15:04:05", hist.Date)
if date.Before(nowMinus) { if date.Before(nowMinus) {
n = n + 1 n = n + 1
db.Delete("history", hist.ID) if appConfig.HistInDB {
db.Delete("history", hist.ID)
} else {
historyDel(i)
}
} }
} }
slog.Info("Removed records from History", "n", n) slog.Info("Removed records from History", "n", n)
} }
func historyDel(i int) {
l := len(histHosts)
histHosts[i] = histHosts[l-1]
histHosts[l-1] = models.Host{}
histHosts = histHosts[:l-1]
}