|
|
@@ -0,0 +1,69 @@
|
|
|
+package flags
|
|
|
+
|
|
|
+import (
|
|
|
+ "github.com/coroot/coroot-node-agent/ebpftracer/l7"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+// 端口白名单数据结构
|
|
|
+type PortWhitelist struct {
|
|
|
+ Ports map[uint16]bool
|
|
|
+}
|
|
|
+
|
|
|
+// 全局端口白名单实例
|
|
|
+var (
|
|
|
+ MysqlPorts *PortWhitelist
|
|
|
+ MariadbPorts *PortWhitelist
|
|
|
+)
|
|
|
+
|
|
|
+// 创建端口白名单
|
|
|
+func NewPortWhitelist(portList string) *PortWhitelist {
|
|
|
+ whitelist := &PortWhitelist{
|
|
|
+ Ports: make(map[uint16]bool),
|
|
|
+ }
|
|
|
+
|
|
|
+ if portList == "" {
|
|
|
+ return whitelist
|
|
|
+ }
|
|
|
+
|
|
|
+ ports := strings.Split(portList, ",")
|
|
|
+ for _, portStr := range ports {
|
|
|
+ portStr = strings.TrimSpace(portStr)
|
|
|
+ if port, err := strconv.ParseUint(portStr, 10, 16); err == nil {
|
|
|
+ whitelist.Ports[uint16(port)] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return whitelist
|
|
|
+}
|
|
|
+
|
|
|
+// 检查端口是否在白名单中
|
|
|
+func (pw *PortWhitelist) Contains(port uint16) bool {
|
|
|
+ if pw == nil {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ return pw.Ports[port]
|
|
|
+}
|
|
|
+
|
|
|
+// 获取协议类型(基于端口白名单)
|
|
|
+func GetProtocolByPort(port uint16) l7.Protocol {
|
|
|
+ if MysqlPorts != nil && MysqlPorts.Contains(port) {
|
|
|
+ return l7.ProtocolMysql
|
|
|
+ }
|
|
|
+ if MariadbPorts != nil && MariadbPorts.Contains(port) {
|
|
|
+ return l7.ProtocolMariaDB
|
|
|
+ }
|
|
|
+ // 如果端口不在白名单中,返回默认协议
|
|
|
+ if *MysqlDefault == "mariadb" {
|
|
|
+ return l7.ProtocolMariaDB
|
|
|
+ }
|
|
|
+
|
|
|
+ return l7.ProtocolMysql
|
|
|
+}
|
|
|
+
|
|
|
+// 初始化端口白名单
|
|
|
+func InitPortWhitelists() {
|
|
|
+ MysqlPorts = NewPortWhitelist(*MysqlPortWhitelist)
|
|
|
+ MariadbPorts = NewPortWhitelist(*MariadbPortWhitelist)
|
|
|
+}
|