diff --git a/LICENSE b/LICENSE index f0a7e00..6455442 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 Jing +Copyright (c) 2018 40t Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 0149a64..ac21695 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,7 @@ # go-sniffer -> 捕获mysql,redis,http,mongodb等协议...完善中 -> - 抓取项目中的数据库请求,如:执行的mysql查询语句 -> - 不需要修改项目代码,通过指定端口抓包解析协议 -> - 快速预览项目中所有的数据请求,便于程序调试 +> Capture mysql,redis,http,mongodb etc protocol... [![GitHub license](https://img.shields.io/github/license/40t/go-sniffer.svg?style=popout-square)](https://github.com/40t/go-sniffer/blob/master/LICENSE) @@ -24,18 +21,21 @@ $ go-sniffer en0 mysql ``` ![image](https://github.com/40t/go-sniffer/raw/master/images/demo.gif) ## Setup: -- 支持 : `MacOS` `Linux` `Unix` -- 不支持 : `windows` -- 依赖:`google/gopacket`库 +- support : `MacOS` `Linux` `Unix` +- not support : `windows` -### 依赖库安装:Centos +### Centos ``` bash $ yum install libcap-devel ``` -### 依赖库安装: Ubuntu +### Ubuntu ``` bash $ apt-get install libcap-dev ``` +### MacOs +``` bash +All is ok +``` ### RUN ``` bash $ go get -v github.com/40t/go-sniffer @@ -44,59 +44,36 @@ $ go run main.go ``` ## Usage: ``` bash -======================================================================= -[使用说明] +================================================================================== +[Usage] - go-sniffer [设备名] [插件名] [插件参数(可选)] + go-sniffer [device] [plug] [plug's params(optional)] - [例子] - go-sniffer en0 redis 抓取redis数据包 - go-sniffer en0 mysql -p 3306 抓取mysql数据包,端口3306 + [Example] + go-sniffer en0 redis Capture redis packet + go-sniffer en0 mysql -p 3306 Capture mysql packet - go-sniffer --[命令] - --help 帮助信息 - --env 环境变量 - --list 插件列表 - --ver 版本信息 - --dev 设备列表 - [例子] - go-sniffer --list 查看可抓取的协议 + go-sniffer --[commend] + --help "this page" + --env "environment variable" + --list "Plug-in list" + --ver "version" + --dev "device" + [Example] + go-sniffer --list "show all plug-in" -======================================================================= -[设备名] : lo0 : 127.0.0.1 -[设备名] : en0 : x:x:x:x:x5:x 192.168.1.3 -[设备名] : utun2 : 1.1.11.1 -======================================================================= +================================================================================== +[device] : lo0 : 127.0.0.1 +[device] : en0 : xx:xx:xx:xx:xx:xx 192.168.199.221 +================================================================================== ``` -### mysql -> 支持预处理语句等常大部分语句 +### Example: ``` bash -$ go-sniffer [设备名] mysql [参数] --p 置顶端口,默认3306 +$ go-sniffer lo0 mysql +$ go-sniffer en0 redis +$ go-sniffer eth0 http -p 8080 +$ go-sniffer eth1 mongodb ``` -![image](https://github.com/40t/go-sniffer/raw/master/images/mysql.gif) - -### redis -``` bash -$ go-sniffer [设备名] redis [参数] --p 置顶端口,默认6379 -``` -![image](https://github.com/40t/go-sniffer/raw/master/images/redis.gif) - -### http -``` bash -$ go-sniffer [设备名] http [参数] --p 置顶端口,默认80 -``` -![image](https://github.com/40t/go-sniffer/raw/master/images/http.gif) - -### mongodb -``` bash -$ go-sniffer [设备名] mongodb [参数] --p 端口,默认27017 -``` -- 支持大部分语句,只有个别少数语句没有实现 - ## License: [MIT](http://opensource.org/licenses/MIT) diff --git a/core/cmd.go b/core/cmd.go index a9ec039..9091cda 100644 --- a/core/cmd.go +++ b/core/cmd.go @@ -10,11 +10,11 @@ import ( const InternalCmdPrefix = "--" const ( - InternalCmdHelp = "help" //帮助文档 - InternalCmdEnv = "env" //环境变量 - InternalCmdList = "list" //插件列表 - InternalCmdVer = "ver" //版本信息 - InternalDevice = "dev" //设备链表 + InternalCmdHelp = "help" + InternalCmdEnv = "env" + InternalCmdList = "list" + InternalCmdVer = "ver" + InternalDevice = "dev" ) type Cmd struct { @@ -32,13 +32,13 @@ func NewCmd(p *Plug) *Cmd { //start func (cm *Cmd) Run() { - //使用帮助 + //print help if len(os.Args) <= 1 { - cm.printHelpMessage(); + cm.printHelpMessage() os.Exit(1) } - //解析命令 + //parse command firstArg := string(os.Args[1]) if strings.HasPrefix(firstArg, InternalCmdPrefix) { cm.parseInternalCmd() @@ -47,7 +47,8 @@ func (cm *Cmd) Run() { } } -//解析内部参数 +//parse internal commend +//like --help, --env, --device func (cm *Cmd) parseInternalCmd() { arg := string(os.Args[1]) @@ -56,9 +57,9 @@ func (cm *Cmd) parseInternalCmd() { switch cmd { case InternalCmdHelp: cm.printHelpMessage() - break; + break case InternalCmdEnv: - fmt.Println("插件路径:"+cm.plugHandle.dir) + fmt.Println("External plug-in path : "+cm.plugHandle.dir) break case InternalCmdList: cm.plugHandle.PrintList() @@ -68,45 +69,45 @@ func (cm *Cmd) parseInternalCmd() { break case InternalDevice: cm.printDevice() - break; + break } os.Exit(1) } -//使用说明 +//usage func (cm *Cmd) printHelpMessage() { fmt.Println("==================================================================================") - fmt.Println("[使用说明]") + fmt.Println("[Usage]") fmt.Println("") - fmt.Println(" go-sniffer [设备名] [插件名] [插件参数(可选)]") + fmt.Println(" go-sniffer [device] [plug] [plug's params(optional)]") fmt.Println() - fmt.Println(" [例子]") - fmt.Println(" go-sniffer en0 redis 抓取redis数据包") - fmt.Println(" go-sniffer en0 mysql -p 3306 抓取mysql数据包,端口3306") + fmt.Println(" [exp]") + fmt.Println(" go-sniffer en0 redis Capture redis packet") + fmt.Println(" go-sniffer en0 mysql -p 3306 Capture mysql packet") fmt.Println() - fmt.Println(" go-sniffer --[命令]") - fmt.Println(" --help 帮助信息") - fmt.Println(" --env 环境变量") - fmt.Println(" --list 插件列表") - fmt.Println(" --ver 版本信息") - fmt.Println(" --dev 设备列表") - fmt.Println(" [例子]") - fmt.Println(" go-sniffer --list 查看可抓取的协议") + fmt.Println(" go-sniffer --[commend]") + fmt.Println(" --help \"this page\"") + fmt.Println(" --env \"environment variable\"") + fmt.Println(" --list \"Plug-in list\"") + fmt.Println(" --ver \"version\"") + fmt.Println(" --dev \"device\"") + fmt.Println(" [exp]") + fmt.Println(" go-sniffer --list \"show all plug-in\"") fmt.Println() fmt.Println("==================================================================================") cm.printDevice() fmt.Println("==================================================================================") } -//打印插件 +//print plug-in list func (cm *Cmd) printPlugList() { l := len(cm.plugHandle.InternalPlugList) l += len(cm.plugHandle.ExternalPlugList) - fmt.Println("# 插件数量:"+strconv.Itoa(l)) + fmt.Println("# Number of plug-ins : "+strconv.Itoa(l)) } -//打印设备 +//print device func (cm *Cmd) printDevice() { ifaces, err:= net.Interfaces() if err != nil { @@ -117,19 +118,19 @@ func (cm *Cmd) printDevice() { for _,a:=range addrs { if ipnet, ok := a.(*net.IPNet); ok { if ip4 := ipnet.IP.To4(); ip4 != nil { - fmt.Println("[设备名] : "+iface.Name+" : "+iface.HardwareAddr.String()+" "+ip4.String()) + fmt.Println("[device] : "+iface.Name+" : "+iface.HardwareAddr.String()+" "+ip4.String()) } } } } } -//解析插件需要的参数 +//Parameters needed for plug-ins func (cm *Cmd) parsePlugCmd() { if len(os.Args) < 3 { - fmt.Println("缺少[插件名]") - fmt.Println("go-sniffer [设备名] [插件名] [插件参数(可选)]") + fmt.Println("not found [Plug-in name]") + fmt.Println("go-sniffer [device] [plug] [plug's params(optional)]") os.Exit(1) } diff --git a/core/core.go b/core/core.go index 9613de7..d3cec8c 100644 --- a/core/core.go +++ b/core/core.go @@ -1,7 +1,6 @@ package core type Core struct{ - //版本信息 Version string } @@ -16,13 +15,13 @@ func New() Core { func (c *Core) Run() { - //插件 + //new plugin plug := NewPlug() - //解析参数 + //parse commend cmd := NewCmd(plug) cmd.Run() - //开启抓包 + //dispatch NewDispatch(plug, cmd).Capture() } \ No newline at end of file diff --git a/core/dispatch.go b/core/dispatch.go index 16ea044..e5d7a02 100644 --- a/core/dispatch.go +++ b/core/dispatch.go @@ -26,24 +26,24 @@ func NewDispatch(plug *Plug, cmd *Cmd) *Dispatch { func (d *Dispatch) Capture() { - // Init device + //init device handle, err := pcap.OpenLive(d.device, 65535, false, pcap.BlockForever) if err != nil { return } - // Set filter + //set filter fmt.Println(d.Plug.BPF) err = handle.SetBPFFilter(d.Plug.BPF) if err != nil { log.Fatal(err) } - // Capture + //capture src := gopacket.NewPacketSource(handle, handle.LinkType()) packets := src.Packets() - // Set up assembly + //set up assembly streamFactory := &ProtocolStreamFactory{ dispatch:d, } @@ -51,14 +51,14 @@ func (d *Dispatch) Capture() { assembler := NewAssembler(streamPool) ticker := time.Tick(time.Minute) - // Loop until ctrl+z + //loop until ctrl+z for { select { case packet := <-packets: if packet.NetworkLayer() == nil || packet.TransportLayer() == nil || packet.TransportLayer().LayerType() != layers.LayerTypeTCP { - fmt.Println("包不能解析") + fmt.Println("ERR : Unknown Packet -_-") continue } tcp := packet.TransportLayer().(*layers.TCP) @@ -91,7 +91,7 @@ func (m *ProtocolStreamFactory) New(net, transport gopacket.Flow) tcpassembly.St } //new stream - fmt.Println("# 新连接:", net, transport) + fmt.Println("# Start new stream:", net, transport) //decode packet go m.dispatch.Plug.ResolveStream(net, transport, &(stm.r)) diff --git a/core/plug.go b/core/plug.go index 796c592..0a341a2 100644 --- a/core/plug.go +++ b/core/plug.go @@ -16,36 +16,26 @@ import ( type Plug struct { - //当前插件路径 dir string - //解析包 ResolveStream func(net gopacket.Flow, transport gopacket.Flow, r io.Reader) - //BPF BPF string - //内部插件列表 InternalPlugList map[string]PlugInterface - //外部插件列表 ExternalPlugList map[string]ExternalPlug } -// 内部插件必须实现此接口 -// ResolvePacket - 包入口 -// BPFFilter - 设置BPF规则,例如mysql: (tcp and port 3306) -// SetFlag - 设置参数 -// Version - 返回插件版本,例如0.1.0 +// All internal plug-ins must implement this interface +// ResolvePacket - entry +// BPFFilter - set BPF, like: mysql(tcp and port 3306) +// SetFlag - plug-in params +// Version - plug-in version type PlugInterface interface { - //解析流 ResolveStream(net gopacket.Flow, transport gopacket.Flow, r io.Reader) - //BPF BPFFilter() string - //设置插件需要的参数 SetFlag([]string) - //获取版本 Version() string } -//外部插件 type ExternalPlug struct { Name string Version string @@ -54,24 +44,17 @@ type ExternalPlug struct { SetFlag func([]string) } -//实例化 func NewPlug() *Plug { var p Plug - //设置默认插件目录 p.dir, _ = filepath.Abs( "./plug/") - - //加载内部插件 p.LoadInternalPlugList() - - //加载外部插件 p.LoadExternalPlugList() return &p } -//加载内部插件 func (p *Plug) LoadInternalPlugList() { list := make(map[string]PlugInterface) @@ -91,12 +74,11 @@ func (p *Plug) LoadInternalPlugList() { p.InternalPlugList = list } -//加载外部so后缀插件 func (p *Plug) LoadExternalPlugList() { dir, err := ioutil.ReadDir(p.dir) if err != nil { - panic(p.dir + "不存在,或者无权访问") + panic(p.dir + "not found") } p.ExternalPlugList = make(map[string]ExternalPlug) @@ -141,17 +123,15 @@ func (p *Plug) LoadExternalPlugList() { } } -//改变插件地址 func (p *Plug) ChangePath(dir string) { p.dir = dir } -//打印插件列表 func (p *Plug) PrintList() { //Print Internal Plug for inPlugName, _ := range p.InternalPlugList { - fmt.Println("内部插件:"+inPlugName) + fmt.Println("internal plug : "+inPlugName) } //split @@ -159,11 +139,10 @@ func (p *Plug) PrintList() { //print External Plug for exPlugName, _ := range p.ExternalPlugList { - fmt.Println("外部插件:"+exPlugName) + fmt.Println("external plug : "+exPlugName) } } -//选择当前使用的插件 && 加载插件 func (p *Plug) SetOption(plugName string, plugParams []string) { //Load Internal Plug diff --git a/images/demo.gif b/images/demo.gif index a8b3305..fe1bdda 100644 Binary files a/images/demo.gif and b/images/demo.gif differ diff --git a/images/http.gif b/images/http.gif deleted file mode 100644 index d751a00..0000000 Binary files a/images/http.gif and /dev/null differ diff --git a/images/mysql.gif b/images/mysql.gif deleted file mode 100644 index bc88a33..0000000 Binary files a/images/mysql.gif and /dev/null differ diff --git a/images/redis.gif b/images/redis.gif deleted file mode 100644 index 605515b..0000000 Binary files a/images/redis.gif and /dev/null differ diff --git a/plugSrc/http/build/entry.go b/plugSrc/http/build/entry.go index 38caef3..7682f04 100644 --- a/plugSrc/http/build/entry.go +++ b/plugSrc/http/build/entry.go @@ -21,8 +21,8 @@ const ( ) type H struct { - port int//端口 - version string//插件版本 + port int + version string } var hp *H @@ -81,7 +81,7 @@ func (m *H) SetFlag(flg []string) { return } if c >> 1 == 0 { - fmt.Println("http参数数量不正确!") + fmt.Println("ERR : Http Number of parameters") os.Exit(1) } for i:=0;i 65535 { - panic("参数不正确: 端口范围(0-65535)") + panic("ERR : port(0-65535)") } break default: - panic("参数不正确") + panic("ERR : mysql's params") } } } \ No newline at end of file diff --git a/plugSrc/mongodb/build/entry.go b/plugSrc/mongodb/build/entry.go index 6fd27bb..fbbca15 100644 --- a/plugSrc/mongodb/build/entry.go +++ b/plugSrc/mongodb/build/entry.go @@ -27,12 +27,12 @@ type stream struct { type packet struct { - isClientFlow bool //客户端->服务器端流 + isClientFlow bool //client->server - messageLength int //总消息大小 - requestID int //此消息的标识符 - responseTo int //从原始请求的requestID - opCode int //请求类型 + messageLength int + requestID int + responseTo int + opCode int //request type payload io.Reader } @@ -56,7 +56,7 @@ func (m *Mongodb) SetFlag(flg []string) { return } if c >> 1 != 1 { - panic("Mongodb参数数量不正确!") + panic("ERR : Mongodb Number of parameters") } for i:=0;i 65535 { - panic("参数不正确: 端口范围(0-65535)") + panic("ERR : port(0-65535)") } break default: - panic("参数不正确") + panic("ERR : mysql's params") } } } @@ -125,10 +125,10 @@ func (m *Mongodb) newPacket(net, transport gopacket.Flow, r io.Reader) *packet { //stream close if err == io.EOF { - fmt.Println(net, transport, " 关闭") + fmt.Println(net, transport, " close") return nil } else if err != nil { - fmt.Println("流解析错误", net, transport, ":", err) + fmt.Println("ERR : Unknown stream", net, transport, ":", err) return nil } @@ -173,7 +173,7 @@ func (stm *stream) resolveClientPacket(pk *packet) { _ = zero _ = flags - msg = fmt.Sprintf(" [更新] [集合:%s] 语句: %v %v", + msg = fmt.Sprintf(" [Update] [coll:%s] %v %v", fullCollectionName, selector, update, @@ -185,7 +185,7 @@ func (stm *stream) resolveClientPacket(pk *packet) { command := ReadBson2Json(pk.payload) _ = flags - msg = fmt.Sprintf(" [插入] [集合:%s] 语句: %v", + msg = fmt.Sprintf(" [Insert] [coll:%s] %v", fullCollectionName, command, ) @@ -202,7 +202,7 @@ func (stm *stream) resolveClientPacket(pk *packet) { command := ReadBson2Json(pk.payload) selector := ReadBson2Json(pk.payload) - msg = fmt.Sprintf(" [查询] [集合:%s] 语句: %v %v", + msg = fmt.Sprintf(" [Query] [coll:%s] %v %v", fullCollectionName, command, selector, @@ -215,7 +215,7 @@ func (stm *stream) resolveClientPacket(pk *packet) { commandArgs := ReadBson2Json(pk.payload) inputDocs := ReadBson2Json(pk.payload) - msg = fmt.Sprintf(" [命令] [数据库:%s] [命令名:%s] %v %v %v", + msg = fmt.Sprintf(" [Commend] [DB:%s] [Cmd:%s] %v %v %v", database, commandName, metaData, @@ -230,7 +230,7 @@ func (stm *stream) resolveClientPacket(pk *packet) { cursorId := ReadInt64(pk.payload) _ = zero - msg = fmt.Sprintf(" [查询更多] [集合:%s] [回复数量:%v] [游标:%v]", + msg = fmt.Sprintf(" [Query more] [coll:%s] [num of reply:%v] [cursor:%v]", fullCollectionName, numberToReturn, cursorId, @@ -244,7 +244,7 @@ func (stm *stream) resolveClientPacket(pk *packet) { _ = zero _ = flags - msg = fmt.Sprintf(" [删除] [集合:%s] 语句: %v", + msg = fmt.Sprintf(" [Delete] [coll:%s] %v", fullCollectionName, selector, ) diff --git a/plugSrc/mysql/build/const.go b/plugSrc/mysql/build/const.go index 37fd3c6..fabc167 100644 --- a/plugSrc/mysql/build/const.go +++ b/plugSrc/mysql/build/const.go @@ -1,12 +1,12 @@ package build const ( - ComQueryRequestPacket string = "【查询】" - OkPacket string = "【正确】" - ErrorPacket string = "【错误】" - PreparePacket string = "【预处理】" - SendClientHandshakePacket string = "【用户认证】" - SendServerHandshakePacket string = "【登录认证】" + ComQueryRequestPacket string = "【Query】" + OkPacket string = "【Ok】" + ErrorPacket string = "【Err】" + PreparePacket string = "【Pretreatment】" + SendClientHandshakePacket string = "【User Auth】" + SendServerHandshakePacket string = "【Login】" ) const ( diff --git a/plugSrc/mysql/build/entry.go b/plugSrc/mysql/build/entry.go index 52781a6..c132b45 100644 --- a/plugSrc/mysql/build/entry.go +++ b/plugSrc/mysql/build/entry.go @@ -22,9 +22,9 @@ const ( ) type Mysql struct { - port int//端口 - version string//插件版本 - source map[string]*stream//流 + port int + version string + source map[string]*stream } type stream struct { @@ -101,7 +101,7 @@ func (m *Mysql) SetFlag(flg []string) { return } if c >> 1 == 0 { - fmt.Println("Mysql参数数量不正确!") + fmt.Println("ERR : Mysql Number of parameters") os.Exit(1) } for i:=0;i 65535 { - panic("参数不正确: 端口范围(0-65535)") + panic("ERR : port(0-65535)") } break default: - panic("参数不正确") + panic("ERR : mysql's params") } } } @@ -137,10 +137,10 @@ func (m *Mysql) newPacket(net, transport gopacket.Flow, r io.Reader) *packet { //close stream if err == io.EOF { - fmt.Println(net, transport, " 关闭") + fmt.Println(net, transport, " close") return nil } else if err != nil { - fmt.Println("错误流:", net, transport, ":", err) + fmt.Println("ERR : Unknown stream", net, transport, ":", err) } //generate new packet @@ -165,7 +165,7 @@ func (m *Mysql) resolvePacketTo(r io.Reader, w io.Writer) (uint8, error) { if n == 0 && err == io.EOF { return 0, io.EOF } - return 0, errors.New("错误流") + return 0, errors.New("ERR : Unknown stream") } length := int(uint32(header[0]) | uint32(header[1])<<8 | uint32(header[2])<<16) @@ -174,9 +174,9 @@ func (m *Mysql) resolvePacketTo(r io.Reader, w io.Writer) (uint8, error) { seq = header[3] if n, err := io.CopyN(w, r, int64(length)); err != nil { - return 0, errors.New("错误流") + return 0, errors.New("ERR : Unknown stream") } else if n != int64(length) { - return 0, errors.New("错误流") + return 0, errors.New("ERR : Unknown stream") } else { return seq, nil } @@ -222,7 +222,7 @@ func (stm *stream) resolveServerPacket(payload []byte, seq int) { errorCode := int(binary.LittleEndian.Uint16(payload[1:3])) errorMsg,_ := ReadStringFromByte(payload[4:]) - msg = GetNowStr(false)+"%s 错误代码:%s,错误信息:%s" + msg = GetNowStr(false)+"%s Err code:%s,Err msg:%s" msg = fmt.Sprintf(msg, ErrorPacket, strconv.Itoa(errorCode), strings.TrimSpace(errorMsg)) case 0x00: @@ -230,7 +230,7 @@ func (stm *stream) resolveServerPacket(payload []byte, seq int) { l,_ := LengthBinary(payload[pos:]) affectedRows := int(l) - msg += GetNowStr(false)+"%s 影响行数:%s" + msg += GetNowStr(false)+"%s Effect Row:%s" msg = fmt.Sprintf(msg, OkPacket, strconv.Itoa(affectedRows)) default: @@ -250,7 +250,7 @@ func (stm *stream) resolveClientPacket(payload []byte, seq int) { msg = fmt.Sprintf("USE %s;\n", payload[1:]) case COM_DROP_DB: - msg = fmt.Sprintf("删除数据库 %s;\n", payload[1:]) + msg = fmt.Sprintf("Drop DB %s;\n", payload[1:]) case COM_CREATE_DB, COM_QUERY: statement := string(payload[1:]) @@ -259,17 +259,17 @@ func (stm *stream) resolveClientPacket(payload []byte, seq int) { serverPacket := stm.findStmtPacket(stm.packets, seq+1) if serverPacket == nil { - log.Println("找不到预处理响应包") + log.Println("ERR : Not found stm packet") } - //获取响应包中预处理id + //fetch stm id stmtID := binary.LittleEndian.Uint32(serverPacket.payload[1:5]) stmt := &Stmt{ ID: stmtID, Query: string(payload[1:]), } - //记录预处理语句 + //record stm sql stm.stmtMap[stmtID] = stmt stmt.FieldCount = binary.LittleEndian.Uint16(serverPacket.payload[5:7]) stmt.ParamCount = binary.LittleEndian.Uint16(serverPacket.payload[7:9]) @@ -305,19 +305,19 @@ func (stm *stream) resolveClientPacket(payload []byte, seq int) { var stmt *Stmt var ok bool if stmt, ok = stm.stmtMap[stmtID]; ok == false { - log.Println("未发现预处理id: ", stmtID) + log.Println("ERR : Not found stm id", stmtID) } - //参数 + //params pos += 5 if stmt.ParamCount > 0 { - //空位图(Null-Bitmap,长度 = (参数数量 + 7) / 8 字节) + //(Null-Bitmap,len = (paramsCount + 7) / 8 byte) step := int((stmt.ParamCount + 7) / 8) nullBitmap := payload[pos : pos+step] pos += step - //参数分隔标志 + //Parameter separator flag := payload[pos] pos++ @@ -325,19 +325,18 @@ func (stm *stream) resolveClientPacket(payload []byte, seq int) { var pTypes []byte var pValues []byte - //如果参数分隔标志值为1 - //n 每个参数的类型值(长度 = 参数数量 * 2 字节) - //n 每个参数的值 + //if flag == 1 + //n (len = paramsCount * 2 byte) if flag == 1 { pTypes = payload[pos : pos+int(stmt.ParamCount)*2] pos += int(stmt.ParamCount) * 2 pValues = payload[pos:] } - //绑定参数 + //bind params err := stmt.BindArgs(nullBitmap, pTypes, pValues) if err != nil { - log.Println("预处理绑定参数失败: ", err) + log.Println("ERR : Could not bind params", err) } } msg = string(stmt.WriteToText()) diff --git a/plugSrc/mysql/build/stmt.go b/plugSrc/mysql/build/stmt.go index 22faeec..80071a5 100644 --- a/plugSrc/mysql/build/stmt.go +++ b/plugSrc/mysql/build/stmt.go @@ -6,7 +6,6 @@ import ( "fmt" "math" "strings" - "errors" ) @@ -23,7 +22,7 @@ func (stmt *Stmt) WriteToText() []byte { var buf bytes.Buffer - str := fmt.Sprintf("预处理编号[%d]: '%s';\n", stmt.ID, stmt.Query) + str := fmt.Sprintf("Stm id[%d]: '%s';\n", stmt.ID, stmt.Query) buf.WriteString(str) for i := 0; i < int(stmt.ParamCount); i++ { @@ -40,7 +39,7 @@ func (stmt *Stmt) WriteToText() []byte { buf.WriteString(str) } - str = fmt.Sprintf("执行预处理[%d]: ", stmt.ID) + str = fmt.Sprintf("Execute stm id[%d]: ", stmt.ID) buf.WriteString(str) for i := 0; i < int(stmt.ParamCount); i++ { if i == 0 { @@ -54,7 +53,7 @@ func (stmt *Stmt) WriteToText() []byte { } buf.WriteString(";\n") - str = fmt.Sprintf("丢弃预处理[%d];\n", stmt.ID) + str = fmt.Sprintf("Drop stm id[%d];\n", stmt.ID) buf.WriteString(str) return buf.Bytes() @@ -72,13 +71,11 @@ func (stmt *Stmt) BindArgs(nullBitmap, paramTypes, paramValues []byte) error { for i := 0; i < int(stmt.ParamCount); i++ { - //判断参数是否为null if nullBitmap[i>>3]&(1<<(uint(i)%8)) > 0 { args[i] = nil continue } - //参数类型 typ := paramTypes[i<<1] unsigned := (paramTypes[(i<<1)+1] & 0x80) > 0 @@ -168,7 +165,7 @@ func (stmt *Stmt) BindArgs(nullBitmap, paramTypes, paramValues []byte) error { continue } default: - return errors.New(fmt.Sprintf("预处理未知类型 %d", typ)) + return errors.New(fmt.Sprintf("ERR : Unknown stm type %d", typ)) } } return nil diff --git a/plugSrc/redis/build/entry.go b/plugSrc/redis/build/entry.go index 5e9df9f..6116e89 100644 --- a/plugSrc/redis/build/entry.go +++ b/plugSrc/redis/build/entry.go @@ -31,19 +31,15 @@ func NewInstance() *Redis{ return redis } -/** - 解析流 - */ func (red Redis) ResolveStream(net, transport gopacket.Flow, r io.Reader) { - //只解析clint发出去的包 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) @@ -53,17 +49,17 @@ func (red Redis) ResolveStream(net, transport gopacket.Flow, r io.Reader) { } } - //过滤无用数据 + //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 = "" @@ -87,7 +83,7 @@ func (red *Redis) SetFlag(flg []string) { return } if c >> 1 != 1 { - panic("Redis参数数量不正确!") + panic("ERR : Redis num of params") } for i:=0;i 65535 { - panic("参数不正确: 端口范围(0-65535)") + panic("ERR : Port(0-65535)") } break default: - panic("参数不正确") + panic("ERR : redis's params") } } } @@ -114,13 +110,13 @@ func (red *Redis) SetFlag(flg []string) { BPFFilter */ func (red *Redis) BPFFilter() string { - return "tcp and port "+strconv.Itoa(redis.port); + return "tcp and port "+strconv.Itoa(redis.port) } /** Version */ func (red *Redis) Version() string { - return red.version; + return red.version }