mini controller
This commit is contained in:
parent
5cea0a4ca2
commit
7ed85511b0
|
@ -95,6 +95,7 @@ func (coll *Collector) parser() {
|
||||||
log.Warnf("unable to unmarshal request from %s: %s", obj.Address.String(), err)
|
log.Warnf("unable to unmarshal request from %s: %s", obj.Address.String(), err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
log.Debugf("recv[%s]: %s", obj.Address, msg.String())
|
||||||
response, err := coll.handler(obj.Address, msg)
|
response, err := coll.handler(obj.Address, msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("unable to handle request from %s: %s", obj.Address.String(), err)
|
log.Warnf("unable to handle request from %s: %s", obj.Address.String(), err)
|
||||||
|
@ -108,6 +109,7 @@ func (coll *Collector) parser() {
|
||||||
|
|
||||||
// SendTo a specifical address
|
// SendTo a specifical address
|
||||||
func (coll *Collector) SendTo(addr *net.UDPAddr, msg *data.SocketMSG) {
|
func (coll *Collector) SendTo(addr *net.UDPAddr, msg *data.SocketMSG) {
|
||||||
|
log.Debugf("send[%s]: %s", addr, msg.String())
|
||||||
data, err := msg.Marshal()
|
data, err := msg.Marshal()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("unable to marshal response for %s: %s", addr.String(), err)
|
log.Warnf("unable to marshal response for %s: %s", addr.String(), err)
|
||||||
|
@ -125,6 +127,7 @@ func (coll *Collector) SendTo(addr *net.UDPAddr, msg *data.SocketMSG) {
|
||||||
|
|
||||||
// Send to every connection to default address
|
// Send to every connection to default address
|
||||||
func (coll *Collector) Send(msg *data.SocketMSG) {
|
func (coll *Collector) Send(msg *data.SocketMSG) {
|
||||||
|
log.Debugf("send: %s", msg.String())
|
||||||
data, err := msg.Marshal()
|
data, err := msg.Marshal()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("unable to marshal response: %s", err)
|
log.Warnf("unable to marshal response: %s", err)
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
|
"dev.sum7.eu/wifictld/analyzer/capture"
|
||||||
|
"dev.sum7.eu/wifictld/analyzer/controller"
|
||||||
|
"dev.sum7.eu/wifictld/analyzer/database"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
central bool
|
||||||
|
)
|
||||||
|
|
||||||
|
// queryCmd represents the query command
|
||||||
|
var controllerCmd = &cobra.Command{
|
||||||
|
Use: "controller <interfaces>",
|
||||||
|
Short: "simulate a wifictld controller",
|
||||||
|
Example: `analyzer controller "eth0,wlan0"`,
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
ifaces := strings.Split(args[0], ",")
|
||||||
|
|
||||||
|
log.Infof("listen on: %s", ifaces)
|
||||||
|
|
||||||
|
var ifacesConfigs []capture.IFaceConfig
|
||||||
|
for _, iface := range ifaces {
|
||||||
|
ifaceConfig := capture.IFaceConfig{
|
||||||
|
InterfaceName: iface,
|
||||||
|
Port: port,
|
||||||
|
IPAddress: ipAddress,
|
||||||
|
}
|
||||||
|
ifacesConfigs = append(ifacesConfigs, ifaceConfig)
|
||||||
|
}
|
||||||
|
|
||||||
|
db := database.NewDB()
|
||||||
|
|
||||||
|
ctr := controller.NewController(db, central)
|
||||||
|
defer ctr.Close()
|
||||||
|
|
||||||
|
coll := capture.NewCollector(ctr.Handler, ifacesConfigs)
|
||||||
|
defer coll.Close()
|
||||||
|
|
||||||
|
ctr.Send = coll.Send
|
||||||
|
ctr.SendTo = coll.SendTo
|
||||||
|
|
||||||
|
// Wait for INT/TERM
|
||||||
|
sigs := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
||||||
|
sig := <-sigs
|
||||||
|
log.Println("received", sig)
|
||||||
|
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
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, "")
|
||||||
|
}
|
|
@ -40,6 +40,8 @@ var dumpCmd = &cobra.Command{
|
||||||
ifacesConfigs = append(ifacesConfigs, ifaceConfig)
|
ifacesConfigs = append(ifacesConfigs, ifaceConfig)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data.DEBUG = debug
|
||||||
|
|
||||||
coll := capture.NewCollector(func(addr *net.UDPAddr, msg *data.SocketMSG) (*data.SocketMSG, error) {
|
coll := capture.NewCollector(func(addr *net.UDPAddr, msg *data.SocketMSG) (*data.SocketMSG, error) {
|
||||||
log.Infof("recv[%s]: %s", addr, msg.String())
|
log.Infof("recv[%s]: %s", addr, msg.String())
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
|
||||||
|
// log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"dev.sum7.eu/wifictld/analyzer/data"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (c *Controller) Handler(addr *net.UDPAddr, msg *data.SocketMSG) (*data.SocketMSG, error) {
|
||||||
|
ignore := false
|
||||||
|
if msg.Types.Is(data.SocketMSGTypeClient) && msg.Client != nil {
|
||||||
|
ignore = c.db.LearnClient(addr.IP, msg.Client)
|
||||||
|
}
|
||||||
|
if !msg.Types.Is(data.SocketMSGTypeRequest) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = &data.SocketMSG{
|
||||||
|
Types: (data.SocketMSGTypeResponse | data.SocketMSGTypeClient),
|
||||||
|
Client: c.db.GetClient(msg.Client.Addr),
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.central || !ignore {
|
||||||
|
return msg, nil
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"dev.sum7.eu/wifictld/analyzer/data"
|
||||||
|
"dev.sum7.eu/wifictld/analyzer/database"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Controller struct {
|
||||||
|
SendTo func(addr *net.UDPAddr, msg *data.SocketMSG)
|
||||||
|
Send func(msg *data.SocketMSG)
|
||||||
|
db *database.DB
|
||||||
|
ticker *time.Ticker
|
||||||
|
central bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewController(db *database.DB, central bool) *Controller {
|
||||||
|
ctl := &Controller{
|
||||||
|
ticker: time.NewTicker(60 * time.Second),
|
||||||
|
db: db,
|
||||||
|
central: central,
|
||||||
|
}
|
||||||
|
go ctl.Repeated()
|
||||||
|
return ctl
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Controller) Close() {
|
||||||
|
c.ticker.Stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Controller) Repeated() {
|
||||||
|
for range c.ticker.C {
|
||||||
|
log.Infof("lerned: %d APs, %d Clients", len(c.db.APs), len(c.db.Clients))
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,6 +9,8 @@ import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var DEBUG = false
|
||||||
|
|
||||||
// SocketMSGType kind of packages
|
// SocketMSGType kind of packages
|
||||||
type SocketMSGType uint32
|
type SocketMSGType uint32
|
||||||
|
|
||||||
|
@ -20,7 +22,10 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func (a SocketMSGType) Is(b SocketMSGType) bool {
|
func (a SocketMSGType) Is(b SocketMSGType) bool {
|
||||||
|
if DEBUG {
|
||||||
|
|
||||||
log.Debugf("SocketType: %x & %x = %x -> %b", a, b, (a & b), (a&b) > 0)
|
log.Debugf("SocketType: %x & %x = %x -> %b", a, b, (a & b), (a&b) > 0)
|
||||||
|
}
|
||||||
return (a & b) > 0
|
return (a & b) > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,7 +89,9 @@ func (msg *SocketMSG) Marshal() ([]byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (msg *SocketMSG) Unmarshal(obj []byte) error {
|
func (msg *SocketMSG) Unmarshal(obj []byte) error {
|
||||||
|
if DEBUG {
|
||||||
log.Debugf("hex unmarshal: %x", obj)
|
log.Debugf("hex unmarshal: %x", obj)
|
||||||
|
}
|
||||||
|
|
||||||
pos := 0
|
pos := 0
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
package database
|
||||||
|
|
||||||
|
type AP struct {
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
package database
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
// log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"dev.sum7.eu/wifictld/analyzer/data"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Client struct {
|
||||||
|
Addr net.HardwareAddr
|
||||||
|
Time time.Time
|
||||||
|
TryProbe uint16
|
||||||
|
TryAuth uint16
|
||||||
|
Connected bool
|
||||||
|
Authed bool
|
||||||
|
FreqHighest uint16
|
||||||
|
SignalLowFreq int16
|
||||||
|
SignalHighFreq int16
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *DB) LearnClient(apIP net.IP, clientWifictl *data.WifiClient) bool {
|
||||||
|
ret := false
|
||||||
|
|
||||||
|
apAddr := apIP.String()
|
||||||
|
ap, ok := db.APs[apAddr]
|
||||||
|
if !ok {
|
||||||
|
ap = &AP{}
|
||||||
|
db.APs[apAddr] = ap
|
||||||
|
}
|
||||||
|
clientAddr := clientWifictl.Addr.String()
|
||||||
|
client, ok := db.Clients[clientAddr]
|
||||||
|
if !ok {
|
||||||
|
client = &Client{
|
||||||
|
Addr: clientWifictl.Addr,
|
||||||
|
}
|
||||||
|
db.Clients[clientAddr] = client
|
||||||
|
}
|
||||||
|
client.Time = time.Now()
|
||||||
|
|
||||||
|
if client.FreqHighest < clientWifictl.FreqHighest {
|
||||||
|
ret = (client.FreqHighest != 0)
|
||||||
|
client.FreqHighest = clientWifictl.FreqHighest
|
||||||
|
}
|
||||||
|
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
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package database
|
||||||
|
|
||||||
|
type DB struct {
|
||||||
|
Clients map[string]*Client `json:"client"`
|
||||||
|
APs map[string]*AP `json:"ap"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDB() *DB {
|
||||||
|
return &DB{
|
||||||
|
Clients: make(map[string]*Client),
|
||||||
|
APs: make(map[string]*AP),
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue