mirror of https://github.com/40t/go-sniffer.git
124 lines
1.8 KiB
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
|
|
}
|