database
parent
39ff9a43b0
commit
3b98fb36cb
@ -0,0 +1,57 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
// "github.com/bdlm/log"
|
||||
"dev.sum7.eu/genofire/golang-lib/database"
|
||||
|
||||
"dev.sum7.eu/genofire/wifictld-analyzer/capture"
|
||||
"dev.sum7.eu/genofire/wifictld-analyzer/data"
|
||||
)
|
||||
|
||||
func (c *Controller) LearnClient(apIP net.IP, clientWifictl *capture.WifiClient) bool {
|
||||
ret := false
|
||||
|
||||
// learn ap
|
||||
ap := &data.AP{
|
||||
IP: apIP,
|
||||
Lastseen: time.Now(),
|
||||
}
|
||||
result := database.Read.First(ap)
|
||||
if result.RowsAffected > 0 {
|
||||
database.Write.Save(ap)
|
||||
} else {
|
||||
database.Write.Create(ap)
|
||||
}
|
||||
|
||||
// learn client
|
||||
client := &data.Client{
|
||||
Addr: clientWifictl.Addr,
|
||||
Lastseen: time.Now(),
|
||||
APAddr: apIP,
|
||||
Connected: clientWifictl.Connected,
|
||||
SignalLowFreq: clientWifictl.SignalLowFreq,
|
||||
SignalHighFreq: clientWifictl.SignalHighFreq,
|
||||
}
|
||||
|
||||
database.Write.FirstOrCreate(client)
|
||||
|
||||
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
|
||||
}
|
||||
database.Write.Save(client)
|
||||
return ret
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package data
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
"time"
|
||||
|
||||
"dev.sum7.eu/genofire/golang-lib/database"
|
||||
)
|
||||
|
||||
type AP struct {
|
||||
IP net.IP `json:"ip" gorm:"PRIMARY_KEY"`
|
||||
Lastseen time.Time `json:"lastseen"`
|
||||
Clients []Client `gorm:"foreignkey:APAddr" json:"-"`
|
||||
}
|
||||
|
||||
// Function to initialize the database
|
||||
func init() {
|
||||
database.AddModel(&AP{})
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package data
|
||||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"dev.sum7.eu/genofire/golang-lib/database"
|
||||
)
|
||||
|
||||
type Client struct {
|
||||
Addr HardwareAddr `gorm:"PRIMARY_KEY" json:"addr"`
|
||||
APAddr net.IP `gorm:"column:ap" json:"ap"`
|
||||
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 time.Time `json:"lastseen"`
|
||||
}
|
||||
|
||||
// Function to initialize the database
|
||||
func init() {
|
||||
database.AddModel(&Client{})
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
"github.com/FreifunkBremen/yanic/lib/jsontime"
|
||||
)
|
||||
|
||||
type AP struct {
|
||||
IP *net.IP `json:"ip"`
|
||||
Lastseen jsontime.Time `json:"lastseen"`
|
||||
}
|
||||
|
||||
func (db *DB) GetClients(ap *AP) []*Client {
|
||||
var clients []*Client
|
||||
for _, client := range db.Clients {
|
||||
if client.AP == ap {
|
||||
clients = append(clients, client)
|
||||
}
|
||||
}
|
||||
return clients
|
||||
}
|
@ -1,84 +0,0 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
// "github.com/bdlm/log"
|
||||
"github.com/FreifunkBremen/yanic/lib/jsontime"
|
||||
|
||||
"dev.sum7.eu/genofire/wifictld-analyzer/capture"
|
||||
"dev.sum7.eu/genofire/wifictld-analyzer/data"
|
||||
)
|
||||
|
||||
type Client struct {
|
||||
AP *AP `json:"-"`
|
||||
APAddr string `json:"ap"`
|
||||
Addr data.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 *capture.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 data.HardwareAddr) *capture.WifiClient {
|
||||
client, ok := db.Clients[addr.String()]
|
||||
wClient := &capture.WifiClient{
|
||||
Addr: addr,
|
||||
Time: time.Now(),
|
||||
}
|
||||
if ok {
|
||||
wClient.TryProbe = client.TryProbe
|
||||
}
|
||||
return wClient
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/bdlm/log"
|
||||
|
||||
"dev.sum7.eu/genofire/golang-lib/file"
|
||||
"dev.sum7.eu/genofire/golang-lib/worker"
|
||||
)
|
||||
|
||||
type DB struct {
|
||||
Clients map[string]*Client `json:"client"`
|
||||
APs map[string]*AP `json:"ap"`
|
||||
worker *worker.Worker
|
||||
}
|
||||
|
||||
func NewDB(path string) *DB {
|
||||
db := &DB{
|
||||
Clients: make(map[string]*Client),
|
||||
APs: make(map[string]*AP),
|
||||
}
|
||||
|
||||
file.ReadJSON(path, db)
|
||||
|
||||
for addr, client := range db.Clients {
|
||||
client.Addr.UnmarshalText([]byte(addr))
|
||||
if ap, ok := db.APs[client.APAddr]; ok {
|
||||
client.AP = ap
|
||||
}
|
||||
}
|
||||
|
||||
db.worker = worker.NewWorker(time.Minute, func() {
|
||||
file.SaveJSON(path, db)
|
||||
log.Debug("save db state")
|
||||
})
|
||||
|
||||
db.worker.Start()
|
||||
|
||||
return db
|
||||
}
|
||||
|
||||
func (db *DB) Close() {
|
||||
if db.worker != nil {
|
||||
db.worker.Close()
|
||||
}
|
||||
}
|
@ -1 +0,0 @@
|
||||
package database
|
Loading…
Reference in New Issue