Release 1.0.4 (#62, #65)

This commit is contained in:
aceberg 2023-10-12 20:39:46 +07:00
parent 0acd987313
commit 64a4b17a8f
9 changed files with 52 additions and 23 deletions

View file

@ -2,6 +2,10 @@
# Change Log # Change Log
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [v1.0.4] - 2023-10-12
### Added
- Configurable `timeout` for `arp-scan` [#65](https://github.com/aceberg/WatchYourLAN/issues/65)
## [v1.0.3] - 2023-10-08 ## [v1.0.3] - 2023-10-08
### Fixed ### Fixed
- Github Action workflow for binary release - Github Action workflow for binary release

View file

@ -41,6 +41,7 @@ Configuration can be done through config file or environment variables
| Variable | Description | Default | | Variable | Description | Default |
| -------- | ----------- | ------- | | -------- | ----------- | ------- |
| ARP_TIMEOUT | Per host timeout for <b>arp-scan</b> (in milliseconds) | 500 |
| AUTH | Enable Session-Cookie authentication | false | | AUTH | Enable Session-Cookie authentication | false |
| AUTH_EXPIRE | Session expiration time. A number and suffix: **m, h, d** or **M**. | 7d | | AUTH_EXPIRE | Session expiration time. A number and suffix: **m, h, d** or **M**. | 7d |
| AUTH_USER | Username | "" | | AUTH_USER | Username | "" |

View file

@ -21,10 +21,12 @@ func Get(path string) (config models.Conf, authConf auth.Conf) {
viper.SetDefault("COLOR", "light") viper.SetDefault("COLOR", "light")
viper.SetDefault("IGNOREIP", "no") viper.SetDefault("IGNOREIP", "no")
viper.SetDefault("LOGLEVEL", "verbose") viper.SetDefault("LOGLEVEL", "verbose")
viper.SetDefault("HISTORY_DAYS", "30")
viper.SetDefault("ARP_TIMEOUT", "500")
viper.SetDefault("AUTH_USER", "") viper.SetDefault("AUTH_USER", "")
viper.SetDefault("AUTH_PASSWORD", "") viper.SetDefault("AUTH_PASSWORD", "")
viper.SetDefault("AUTH_EXPIRE", "7d") viper.SetDefault("AUTH_EXPIRE", "7d")
viper.SetDefault("HISTORY_DAYS", "30")
viper.SetConfigFile(path) viper.SetConfigFile(path)
viper.SetConfigType("yaml") viper.SetConfigType("yaml")
@ -44,6 +46,8 @@ func Get(path string) (config models.Conf, authConf auth.Conf) {
config.IgnoreIP = viper.Get("IGNOREIP").(string) config.IgnoreIP = viper.Get("IGNOREIP").(string)
config.LogLevel = viper.Get("LOGLEVEL").(string) config.LogLevel = viper.Get("LOGLEVEL").(string)
config.HistDays = viper.Get("HISTORY_DAYS").(string) config.HistDays = viper.Get("HISTORY_DAYS").(string)
config.ArpTimeout = viper.Get("ARP_TIMEOUT").(string)
authConf.Auth = viper.GetBool("AUTH") authConf.Auth = viper.GetBool("AUTH")
authConf.User, _ = viper.Get("AUTH_USER").(string) authConf.User, _ = viper.Get("AUTH_USER").(string)
authConf.Password, _ = viper.Get("AUTH_PASSWORD").(string) authConf.Password, _ = viper.Get("AUTH_PASSWORD").(string)
@ -72,6 +76,7 @@ func Write(path string, config models.Conf, authConf auth.Conf) {
viper.Set("IGNOREIP", config.IgnoreIP) viper.Set("IGNOREIP", config.IgnoreIP)
viper.Set("LOGLEVEL", config.LogLevel) viper.Set("LOGLEVEL", config.LogLevel)
viper.Set("HISTORY_DAYS", config.HistDays) viper.Set("HISTORY_DAYS", config.HistDays)
viper.Set("ARP_TIMEOUT", config.ArpTimeout)
viper.Set("auth", authConf.Auth) viper.Set("auth", authConf.Auth)
viper.Set("auth_user", authConf.User) viper.Set("auth_user", authConf.User)

View file

@ -20,6 +20,7 @@ type Conf struct {
Icon string Icon string
Auth bool Auth bool
HistDays string HistDays string
ArpTimeout string
} }
// Host - one host // Host - one host

View file

@ -10,7 +10,7 @@ import (
) )
func scanIface(iface string) string { func scanIface(iface string) string {
cmd, err := exec.Command("arp-scan", "-glNx", "-I", iface).Output() cmd, err := exec.Command("arp-scan", "-glNx", "-t", appConfig.ArpTimeout, "-I", iface).Output()
if err != nil { if err != nil {
return string("") return string("")
} }
@ -40,15 +40,15 @@ func parseOutput(text string) []models.Host {
} }
// Scan all interfaces // Scan all interfaces
func arpScan(allIfaces string, logLevel string) []models.Host { func arpScan() []models.Host {
var text string var text string
var foundHosts = []models.Host{} var foundHosts = []models.Host{}
perString := strings.Split(allIfaces, " ") perString := strings.Split(appConfig.Iface, " ")
for _, iface := range perString { for _, iface := range perString {
text = scanIface(iface) text = scanIface(iface)
if logLevel != "short" { if appConfig.LogLevel != "short" {
log.Println("INFO: scanning interface", iface) log.Println("INFO: scanning interface", iface)
log.Println("INFO: found IPs:", text) log.Println("INFO: found IPs:", text)
} }

View file

@ -28,7 +28,7 @@ func Start(config models.Conf, quit chan bool) {
plusDate := lastDate.Add(time.Duration(appConfig.Timeout) * time.Second) plusDate := lastDate.Add(time.Duration(appConfig.Timeout) * time.Second)
if nowDate.After(plusDate) { if nowDate.After(plusDate) {
structHosts = arpScan(appConfig.Iface, appConfig.LogLevel) // arpscan.go structHosts = arpScan() // arpscan.go
dbHosts = db.Select(appConfig.DbPath) dbHosts = db.Select(appConfig.DbPath)
toMap() toMap()

View file

@ -42,6 +42,7 @@ func saveConfigHandler(w http.ResponseWriter, r *http.Request) {
AppConfig.IgnoreIP = r.FormValue("ignoreip") AppConfig.IgnoreIP = r.FormValue("ignoreip")
AppConfig.LogLevel = r.FormValue("loglevel") AppConfig.LogLevel = r.FormValue("loglevel")
AppConfig.HistDays = r.FormValue("history") AppConfig.HistDays = r.FormValue("history")
AppConfig.ArpTimeout = r.FormValue("arp_timeout")
timeout := r.FormValue("timeout") timeout := r.FormValue("timeout")
AppConfig.Timeout, err = strconv.Atoi(timeout) AppConfig.Timeout, err = strconv.Atoi(timeout)

View file

@ -24,7 +24,7 @@
</tr> </tr>
<tr> <tr>
<td>Timeout (seconds)</td> <td>Timeout (seconds)</td>
<td><input name="timeout" type="text" class="form-control" value="{{ .Config.Timeout }}"></td> <td><input name="timeout" type="number" class="form-control" value="{{ .Config.Timeout }}"></td>
</tr> </tr>
<tr> <tr>
<td>Shoutrrr URL</td> <td>Shoutrrr URL</td>
@ -71,7 +71,23 @@
</tr> </tr>
<tr> <tr>
<td>Keep history (days)</td> <td>Keep history (days)</td>
<td><input name="history" type="text" class="form-control" value="{{ .Config.HistDays }}"></td> <td><input name="history" type="number" class="form-control" value="{{ .Config.HistDays }}"></td>
</tr>
<tr>
<td>Arp Timeout</td>
<td>
<select name="arp_timeout" class="form-select">
<option selected value="{{ .Config.ArpTimeout }}">{{ .Config.ArpTimeout }}</option>
<option value="100">100</option>
<option value="250">250</option>
<option value="500">500</option>
<option value="1000">1000</option>
<option value="1500">1500</option>
<option value="2000">2000</option>
<option value="3000">3000</option>
<option value="5000">5000</option>
</select>
</td>
</tr> </tr>
<tr> <tr>
<td><button type="submit" class="btn btn-primary">Save</button></td> <td><button type="submit" class="btn btn-primary">Save</button></td>
@ -92,6 +108,7 @@
<p>● If you want to detect unknown hosts by MAC only, set <b>Ignore IP</b> to "yes"</p> <p>● If you want to detect unknown hosts by MAC only, set <b>Ignore IP</b> to "yes"</p>
<p><b>Log Level</b> defines how much log output you want to see</p> <p><b>Log Level</b> defines how much log output you want to see</p>
<p>● The <b>Clear table</b> button below will delete all records from table. If you want to delete a single host, click on its MAC and press <b>Delete host</b> button</p> <p>● The <b>Clear table</b> button below will delete all records from table. If you want to delete a single host, click on its MAC and press <b>Delete host</b> button</p>
<p><b>Arp Timeout</b> per host timeout for <b>arp-scan</b> (in milliseconds). Default: 500</p>
</div> </div>
<br> <br>
<form action="/clear/" method="post"> <form action="/clear/" method="post">

View file

@ -1 +1 @@
VERSION=1.0.3 VERSION=1.0.4