save db + config + remove central
This commit is contained in:
parent
ff098f5090
commit
e7499dbae5
|
@ -16,7 +16,7 @@ type Collector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCollector creates a Collector struct
|
// NewCollector creates a Collector struct
|
||||||
func NewCollector(handler data.Handler, ifaces []IFaceConfig) *Collector {
|
func NewCollector(handler data.Handler, ifaces []*IFaceConfig) *Collector {
|
||||||
|
|
||||||
coll := &Collector{
|
coll := &Collector{
|
||||||
handler: handler,
|
handler: handler,
|
||||||
|
@ -26,6 +26,12 @@ func NewCollector(handler data.Handler, ifaces []IFaceConfig) *Collector {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, iface := range ifaces {
|
for _, iface := range ifaces {
|
||||||
|
if iface.Port == 0 {
|
||||||
|
iface.Port = Port
|
||||||
|
}
|
||||||
|
if iface.IPAddress == "" {
|
||||||
|
iface.IPAddress = MulticastAddressDefault
|
||||||
|
}
|
||||||
coll.listenUDP(iface)
|
coll.listenUDP(iface)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +49,7 @@ func (coll *Collector) Close() {
|
||||||
close(coll.queue)
|
close(coll.queue)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (coll *Collector) listenUDP(iface IFaceConfig) {
|
func (coll *Collector) listenUDP(iface *IFaceConfig) {
|
||||||
ip := net.ParseIP(iface.IPAddress)
|
ip := net.ParseIP(iface.IPAddress)
|
||||||
var conn *net.UDPConn
|
var conn *net.UDPConn
|
||||||
var err error
|
var err error
|
||||||
|
|
|
@ -3,48 +3,35 @@ package cmd
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"strings"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"dev.sum7.eu/genofire/golang-lib/file"
|
||||||
|
|
||||||
|
"dev.sum7.eu/wifictld/analyzer/config"
|
||||||
"dev.sum7.eu/wifictld/analyzer/capture"
|
"dev.sum7.eu/wifictld/analyzer/capture"
|
||||||
"dev.sum7.eu/wifictld/analyzer/controller"
|
"dev.sum7.eu/wifictld/analyzer/controller"
|
||||||
"dev.sum7.eu/wifictld/analyzer/database"
|
"dev.sum7.eu/wifictld/analyzer/database"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
central bool
|
|
||||||
)
|
|
||||||
|
|
||||||
// queryCmd represents the query command
|
// queryCmd represents the query command
|
||||||
var controllerCmd = &cobra.Command{
|
var controllerCmd = &cobra.Command{
|
||||||
Use: "controller <interfaces>",
|
Use: "controller <interfaces>",
|
||||||
Short: "simulate a wifictld controller",
|
Short: "simulate a wifictld controller",
|
||||||
Example: `analyzer controller "eth0,wlan0"`,
|
Example: `analyzer controller "/etc/wifictld.conf"`,
|
||||||
Args: cobra.ExactArgs(1),
|
Args: cobra.ExactArgs(1),
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
ifaces := strings.Split(args[0], ",")
|
configObj := &config.Config{}
|
||||||
|
|
||||||
log.Infof("listen on: %s", ifaces)
|
file.ReadTOML(args[0], configObj)
|
||||||
|
|
||||||
var ifacesConfigs []capture.IFaceConfig
|
db := database.NewDB(configObj.StatePath)
|
||||||
for _, iface := range ifaces {
|
|
||||||
ifaceConfig := capture.IFaceConfig{
|
|
||||||
InterfaceName: iface,
|
|
||||||
Port: port,
|
|
||||||
IPAddress: ipAddress,
|
|
||||||
}
|
|
||||||
ifacesConfigs = append(ifacesConfigs, ifaceConfig)
|
|
||||||
}
|
|
||||||
|
|
||||||
db := database.NewDB()
|
ctr := controller.NewController(db)
|
||||||
|
|
||||||
ctr := controller.NewController(db, central)
|
|
||||||
defer ctr.Close()
|
defer ctr.Close()
|
||||||
|
|
||||||
coll := capture.NewCollector(ctr.Handler, ifacesConfigs)
|
coll := capture.NewCollector(ctr.Handler, configObj.Interfaces)
|
||||||
defer coll.Close()
|
defer coll.Close()
|
||||||
|
|
||||||
ctr.Send = coll.Send
|
ctr.Send = coll.Send
|
||||||
|
@ -61,7 +48,4 @@ var controllerCmd = &cobra.Command{
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RootCmd.AddCommand(controllerCmd)
|
RootCmd.AddCommand(controllerCmd)
|
||||||
controllerCmd.Flags().IntVar(&port, "port", capture.Port, "define a port to listen (if not set or set to 0 the kernel will use a random free port at its own)")
|
|
||||||
controllerCmd.Flags().StringVar(&ipAddress, "listen", capture.MulticastAddressDefault, "")
|
|
||||||
controllerCmd.Flags().BoolVar(¢ral, "central", false, "")
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,9 +30,9 @@ var dumpCmd = &cobra.Command{
|
||||||
|
|
||||||
log.Infof("listen on: %s", ifaces)
|
log.Infof("listen on: %s", ifaces)
|
||||||
|
|
||||||
var ifacesConfigs []capture.IFaceConfig
|
var ifacesConfigs []*capture.IFaceConfig
|
||||||
for _, iface := range ifaces {
|
for _, iface := range ifaces {
|
||||||
ifaceConfig := capture.IFaceConfig{
|
ifaceConfig := &capture.IFaceConfig{
|
||||||
InterfaceName: iface,
|
InterfaceName: iface,
|
||||||
Port: port,
|
Port: port,
|
||||||
IPAddress: ipAddress,
|
IPAddress: ipAddress,
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"dev.sum7.eu/wifictld/analyzer/capture"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
StatePath string `toml:"state_path"`
|
||||||
|
Interfaces []*capture.IFaceConfig `toml:"interfaces"`
|
||||||
|
}
|
|
@ -18,11 +18,10 @@ type Controller struct {
|
||||||
central bool
|
central bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewController(db *database.DB, central bool) *Controller {
|
func NewController(db *database.DB) *Controller {
|
||||||
ctl := &Controller{
|
ctl := &Controller{
|
||||||
ticker: time.NewTicker(60 * time.Second),
|
ticker: time.NewTicker(time.Minute),
|
||||||
db: db,
|
db: db,
|
||||||
central: central,
|
|
||||||
}
|
}
|
||||||
go ctl.Repeated()
|
go ctl.Repeated()
|
||||||
return ctl
|
return ctl
|
||||||
|
@ -34,6 +33,6 @@ func (c *Controller) Close() {
|
||||||
|
|
||||||
func (c *Controller) Repeated() {
|
func (c *Controller) Repeated() {
|
||||||
for range c.ticker.C {
|
for range c.ticker.C {
|
||||||
log.Infof("lerned: %d APs, %d Clients", len(c.db.APs), len(c.db.Clients))
|
log.Debug("lerned: %d APs, %d Clients", len(c.db.APs), len(c.db.Clients))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
package database
|
package database
|
||||||
|
|
||||||
|
import "net"
|
||||||
|
|
||||||
type AP struct {
|
type AP struct {
|
||||||
|
IP *net.IP
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,12 +24,16 @@ type Client struct {
|
||||||
func (db *DB) LearnClient(apIP net.IP, clientWifictl *data.WifiClient) bool {
|
func (db *DB) LearnClient(apIP net.IP, clientWifictl *data.WifiClient) bool {
|
||||||
ret := false
|
ret := false
|
||||||
|
|
||||||
|
// learn ap
|
||||||
apAddr := apIP.String()
|
apAddr := apIP.String()
|
||||||
ap, ok := db.APs[apAddr]
|
ap, ok := db.APs[apAddr]
|
||||||
if !ok {
|
if !ok {
|
||||||
ap = &AP{}
|
ap = &AP{}
|
||||||
db.APs[apAddr] = ap
|
db.APs[apAddr] = ap
|
||||||
}
|
}
|
||||||
|
ap.IP = &apIP
|
||||||
|
|
||||||
|
// learn client
|
||||||
clientAddr := clientWifictl.Addr.String()
|
clientAddr := clientWifictl.Addr.String()
|
||||||
client, ok := db.Clients[clientAddr]
|
client, ok := db.Clients[clientAddr]
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|
|
@ -1,13 +1,40 @@
|
||||||
package database
|
package database
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"dev.sum7.eu/genofire/golang-lib/file"
|
||||||
|
"dev.sum7.eu/genofire/golang-lib/worker"
|
||||||
|
)
|
||||||
|
|
||||||
type DB struct {
|
type DB struct {
|
||||||
Clients map[string]*Client `json:"client"`
|
Clients map[string]*Client `json:"client"`
|
||||||
APs map[string]*AP `json:"ap"`
|
APs map[string]*AP `json:"ap"`
|
||||||
|
worker *worker.Worker
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDB() *DB {
|
func NewDB(path string) *DB {
|
||||||
return &DB{
|
db := &DB{
|
||||||
Clients: make(map[string]*Client),
|
Clients: make(map[string]*Client),
|
||||||
APs: make(map[string]*AP),
|
APs: make(map[string]*AP),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file.ReadJSON(path, db)
|
||||||
|
|
||||||
|
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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
state_path = "/tmp/wifictld.json"
|
||||||
|
|
||||||
|
[[interfaces]]
|
||||||
|
ifname = "mmfd0"
|
||||||
|
#port = 1000
|
||||||
|
#ip_address = "ff02::31f1"
|
Loading…
Reference in New Issue