116 lines
2.2 KiB
Go
116 lines
2.2 KiB
Go
package web
|
|
|
|
import (
|
|
"bytes"
|
|
"net"
|
|
"net/http"
|
|
"reflect"
|
|
"sort"
|
|
"strconv"
|
|
|
|
"github.com/aceberg/WatchYourLAN/internal/models"
|
|
)
|
|
|
|
func sortByIPs(method string) {
|
|
type ipHost struct {
|
|
Host models.Host
|
|
IP net.IP
|
|
}
|
|
toSort := []ipHost{}
|
|
var oneSort ipHost
|
|
|
|
for _, oneHost := range AllHosts {
|
|
oneSort.Host = oneHost
|
|
oneSort.IP = net.ParseIP(oneHost.IP)
|
|
toSort = append(toSort, oneSort)
|
|
}
|
|
|
|
switch method {
|
|
case "asc":
|
|
sort.Slice(toSort, func(i, j int) bool {
|
|
return bytes.Compare(toSort[i].IP, toSort[j].IP) < 0
|
|
})
|
|
case "desc":
|
|
sort.Slice(toSort, func(i, j int) bool {
|
|
return bytes.Compare(toSort[i].IP, toSort[j].IP) > 0
|
|
})
|
|
}
|
|
|
|
AllHosts = []models.Host{}
|
|
for _, oneSort := range toSort {
|
|
AllHosts = append(AllHosts, oneSort.Host)
|
|
}
|
|
}
|
|
|
|
func sortHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
|
sortMethod := r.FormValue("sort_method")
|
|
|
|
switch sortMethod {
|
|
case "name-up":
|
|
sortByField("asc", "Name")
|
|
case "name-down":
|
|
sortByField("desc", "Name")
|
|
case "ip-up":
|
|
sortByIPs("asc")
|
|
case "ip-down":
|
|
sortByIPs("desc")
|
|
case "mac-up":
|
|
sortByField("asc", "Mac")
|
|
case "mac-down":
|
|
sortByField("desc", "Mac")
|
|
case "hw-up":
|
|
sortByField("asc", "Hw")
|
|
case "hw-down":
|
|
sortByField("desc", "Hw")
|
|
case "date-up":
|
|
sortByField("asc", "Date")
|
|
case "date-down":
|
|
sortByField("desc", "Date")
|
|
case "known-up":
|
|
sortByField("asc", "Known")
|
|
case "known-down":
|
|
sortByField("desc", "Known")
|
|
default:
|
|
updateAllHosts()
|
|
}
|
|
|
|
http.Redirect(w, r, r.Header.Get("Referer"), 302)
|
|
}
|
|
|
|
func sortByField(method string, field string) {
|
|
type fieldHost struct {
|
|
Host models.Host
|
|
F string
|
|
}
|
|
toSort := []fieldHost{}
|
|
var oneSort fieldHost
|
|
|
|
for _, host := range AllHosts {
|
|
oneSort.Host = host
|
|
r := reflect.ValueOf(&host)
|
|
f := reflect.Indirect(r).FieldByName(field)
|
|
if field == "Known" {
|
|
oneSort.F = strconv.FormatUint(f.Uint(), 10)
|
|
} else {
|
|
oneSort.F = f.String()
|
|
}
|
|
toSort = append(toSort, oneSort)
|
|
}
|
|
|
|
switch method {
|
|
case "asc":
|
|
sort.Slice(toSort, func(i, j int) bool {
|
|
return toSort[i].F < toSort[j].F
|
|
})
|
|
case "desc":
|
|
sort.Slice(toSort, func(i, j int) bool {
|
|
return toSort[i].F > toSort[j].F
|
|
})
|
|
}
|
|
|
|
AllHosts = []models.Host{}
|
|
for _, oneSort := range toSort {
|
|
AllHosts = append(AllHosts, oneSort.Host)
|
|
}
|
|
}
|