84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
package database
|
|
|
|
import (
|
|
"net"
|
|
"time"
|
|
|
|
// "github.com/bdlm/log"
|
|
"github.com/FreifunkBremen/yanic/lib/jsontime"
|
|
|
|
"dev.sum7.eu/genofire/wifictld-analyzer/data"
|
|
)
|
|
|
|
type Client struct {
|
|
AP *AP `json:"-"`
|
|
APAddr string `json:"ap"`
|
|
Addr net.HardwareAddr `json:"-"`
|
|
TryProbe uint16 `json:"try_probe"`
|
|
TryAuth uint16 `json:"try_auth"`
|
|
Connected bool `json:"connected"`
|
|
Authed bool `json:"authed"`
|
|
FreqHighest uint16 `json:"freq_highest"`
|
|
SignalLowFreq int16 `json:"signal_low_freq"`
|
|
SignalHighFreq int16 `json:"signal_high_freq"`
|
|
Lastseen jsontime.Time `json:"lastseen"`
|
|
}
|
|
|
|
func (db *DB) LearnClient(apIP net.IP, clientWifictl *data.WifiClient) bool {
|
|
ret := false
|
|
|
|
// learn ap
|
|
apAddr := apIP.String()
|
|
ap, ok := db.APs[apAddr]
|
|
if !ok {
|
|
ap = &AP{}
|
|
db.APs[apAddr] = ap
|
|
}
|
|
ap.IP = &apIP
|
|
ap.Lastseen = jsontime.Now()
|
|
|
|
// learn client
|
|
clientAddr := clientWifictl.Addr.String()
|
|
client, ok := db.Clients[clientAddr]
|
|
if !ok {
|
|
client = &Client{
|
|
Addr: clientWifictl.Addr,
|
|
}
|
|
db.Clients[clientAddr] = client
|
|
}
|
|
client.Lastseen = jsontime.Now()
|
|
client.AP = ap
|
|
client.APAddr = apAddr
|
|
client.Connected = clientWifictl.Connected
|
|
client.SignalLowFreq = clientWifictl.SignalLowFreq
|
|
client.SignalHighFreq = clientWifictl.SignalHighFreq
|
|
|
|
if clientWifictl.TryAuth > client.TryAuth {
|
|
client.TryAuth = clientWifictl.TryAuth
|
|
}
|
|
if clientWifictl.TryProbe > client.TryProbe {
|
|
client.TryProbe = clientWifictl.TryProbe
|
|
}
|
|
|
|
if client.FreqHighest < clientWifictl.FreqHighest {
|
|
ret = (client.FreqHighest != 0)
|
|
client.FreqHighest = clientWifictl.FreqHighest
|
|
}
|
|
if clientWifictl.Authed {
|
|
client.Authed = clientWifictl.Authed
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (db *DB) GetClient(addr net.HardwareAddr) *data.WifiClient {
|
|
client, ok := db.Clients[addr.String()]
|
|
wClient := &data.WifiClient{
|
|
Addr: addr,
|
|
Time: time.Now(),
|
|
}
|
|
if ok {
|
|
wClient.TryProbe = client.TryProbe
|
|
}
|
|
return wClient
|
|
}
|