go-sniffer/plugSrc/redis/build/entry.go

124 lines
1.8 KiB
Go

package build
import (
"bufio"
"fmt"
"io"
"strconv"
"strings"
"time"
"github.com/google/gopacket"
)
type Redis struct {
port int
version string
cmd chan string
done chan bool
}
const (
Port int = 6379
Version string = "0.1"
CmdPort string = "-p"
)
var redis = &Redis{
port: Port,
version: Version,
}
func NewInstance() *Redis {
return redis
}
func (red Redis) ResolveStream(net, transport gopacket.Flow, r io.Reader) {
buf := bufio.NewReader(r)
var cmd string
var cmdCount = 0
for {
line, _, _ := buf.ReadLine()
if len(line) == 0 {
buff := make([]byte, 1)
_, err := r.Read(buff)
if err == io.EOF {
red.done <- true
return
}
}
//Filtering useless data
if !strings.HasPrefix(string(line), "*") {
continue
}
//Do not display
if strings.EqualFold(transport.Src().String(), strconv.Itoa(red.port)) == true {
continue
}
//run
l := string(line[1])
cmdCount, _ = strconv.Atoi(l)
cmd = ""
for j := 0; j < cmdCount*2; j++ {
c, _, _ := buf.ReadLine()
if j&1 == 0 {
continue
}
cmd += " " + string(c)
}
fmt.Println(time.Now().Format("2006-01-02 15:04:05.000") + " | " + cmd)
}
}
/**
SetOption
*/
func (red *Redis) SetFlag(flg []string) {
c := len(flg)
if c == 0 {
return
}
if c>>1 != 1 {
panic("ERR : Redis num of params")
}
for i := 0; i < c; i = i + 2 {
key := flg[i]
val := flg[i+1]
switch key {
case CmdPort:
port, err := strconv.Atoi(val)
redis.port = port
if err != nil {
panic("ERR : Port error")
}
if port < 0 || port > 65535 {
panic("ERR : Port(0-65535)")
}
break
default:
panic("ERR : redis's params")
}
}
}
/**
BPFFilter
*/
func (red *Redis) BPFFilter() string {
return "tcp and port " + strconv.Itoa(redis.port)
}
/**
Version
*/
func (red *Redis) Version() string {
return red.version
}