|
@@ -2,6 +2,7 @@ package identify
|
|
|
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
+ "fmt"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
)
|
|
@@ -34,6 +35,7 @@ type SingleItem struct {
|
|
|
ov ItemValue // 上一次的值
|
|
|
|
|
|
rules map[EventName]Rule
|
|
|
+ vars map[string]string
|
|
|
}
|
|
|
|
|
|
func (s *SingleItem) Check(ov, nv ItemValue) EventName {
|
|
@@ -143,7 +145,6 @@ func (s *SingleItem) nvNotIn(slice []ItemValue) bool {
|
|
|
func (s *SingleItem) inSlice(slice []ItemValue, v ItemValue) bool {
|
|
|
for _, s2 := range slice {
|
|
|
s1 := s.transVar(s2)
|
|
|
-
|
|
|
if s1 == v {
|
|
|
return true
|
|
|
}
|
|
@@ -156,13 +157,29 @@ func (s *SingleItem) inSlice(slice []ItemValue, v ItemValue) bool {
|
|
|
}
|
|
|
|
|
|
func (s *SingleItem) transVar(v ItemValue) ItemValue {
|
|
|
- if v == VAR_NV {
|
|
|
- v = s.nv
|
|
|
+ v = strings.Replace(v, "$nv", s.nv, 10)
|
|
|
+ v = strings.Replace(v, "$ov", s.ov, 10)
|
|
|
+ if strings.Index(v, "$") > -1 && len(s.vars) > 0 {
|
|
|
+ for k, kv := range s.vars {
|
|
|
+ v = strings.Replace(v, "$"+k, kv, 10)
|
|
|
+ }
|
|
|
+ //varName := v[1:len(v)]
|
|
|
+ //if val, ok := s.vars[varName]; ok {
|
|
|
+ // v = val
|
|
|
+ //}
|
|
|
}
|
|
|
|
|
|
- if v == VAR_OV {
|
|
|
- v = s.ov
|
|
|
+ if strings.Index(v, "...") == -1 {
|
|
|
+ v = s.calc(v)
|
|
|
+ } else {
|
|
|
+ vl := strings.Split(v, "...")
|
|
|
+ if len(vl) != 2 {
|
|
|
+ return v
|
|
|
+ } else {
|
|
|
+ return fmt.Sprintf("%s...%s", s.calc(vl[0]), s.calc(vl[1]))
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
return v
|
|
|
}
|
|
|
|
|
@@ -204,6 +221,103 @@ func (s *SingleItem) compareRange(r string, v string) bool {
|
|
|
return min <= vi && vi <= max
|
|
|
}
|
|
|
|
|
|
+func (s *SingleItem) SetVars(vars map[ItemName]ItemValue) {
|
|
|
+ s.vars = vars
|
|
|
+}
|
|
|
+
|
|
|
+func (s *SingleItem) calc(v string) string {
|
|
|
+ if strings.Index(v, "+") > 1 {
|
|
|
+ vl := strings.Split(v, "+")
|
|
|
+ if len(vl) != 2 {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+ var st, nd int64
|
|
|
+ var err error
|
|
|
+ if st, err = strconv.ParseInt(strings.TrimSpace(vl[0]), 10, 64); err != nil {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+
|
|
|
+ if nd, err = strconv.ParseInt(strings.TrimSpace(vl[1]), 10, 64); err != nil {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+
|
|
|
+ return fmt.Sprintf("%d", st+nd)
|
|
|
+ }
|
|
|
+
|
|
|
+ if strings.Index(v, "-") > 1 {
|
|
|
+ vl := strings.Split(v, "-")
|
|
|
+ if len(vl) != 2 {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+ var st, nd int64
|
|
|
+ var err error
|
|
|
+ if st, err = strconv.ParseInt(strings.TrimSpace(vl[0]), 10, 64); err != nil {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+
|
|
|
+ if nd, err = strconv.ParseInt(strings.TrimSpace(vl[1]), 10, 64); err != nil {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+
|
|
|
+ return fmt.Sprintf("%d", st-nd)
|
|
|
+ }
|
|
|
+
|
|
|
+ if strings.Index(v, "*") > 1 {
|
|
|
+ vl := strings.Split(v, "*")
|
|
|
+ if len(vl) != 2 {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+ var st, nd int64
|
|
|
+ var err error
|
|
|
+ if st, err = strconv.ParseInt(strings.TrimSpace(vl[0]), 10, 64); err != nil {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+
|
|
|
+ if nd, err = strconv.ParseInt(strings.TrimSpace(vl[1]), 10, 64); err != nil {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+
|
|
|
+ return fmt.Sprintf("%d", st*nd)
|
|
|
+ }
|
|
|
+
|
|
|
+ if strings.Index(v, "/") > 1 {
|
|
|
+ vl := strings.Split(v, "/")
|
|
|
+ if len(vl) != 2 {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+ var st, nd int64
|
|
|
+ var err error
|
|
|
+ if st, err = strconv.ParseInt(strings.TrimSpace(vl[0]), 10, 64); err != nil {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+
|
|
|
+ if nd, err = strconv.ParseInt(strings.TrimSpace(vl[1]), 10, 64); err != nil {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+
|
|
|
+ return fmt.Sprintf("%d", st/nd)
|
|
|
+ }
|
|
|
+
|
|
|
+ if strings.Index(v, "%") > 1 {
|
|
|
+ vl := strings.Split(v, "%")
|
|
|
+ if len(vl) != 2 {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+ var st, nd int64
|
|
|
+ var err error
|
|
|
+ if st, err = strconv.ParseInt(strings.TrimSpace(vl[0]), 10, 64); err != nil {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+
|
|
|
+ if nd, err = strconv.ParseInt(strings.TrimSpace(vl[1]), 10, 64); err != nil {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+
|
|
|
+ return fmt.Sprintf("%d", st%nd)
|
|
|
+ }
|
|
|
+ return v
|
|
|
+}
|
|
|
+
|
|
|
func (s *SingleItem) compareLogic(r string, v string) bool {
|
|
|
rl := strings.Split(r, " ")
|
|
|
if len(rl) != 2 {
|
|
@@ -243,6 +357,7 @@ func (s *SingleItem) compareLogic(r string, v string) bool {
|
|
|
func NewSingleCheck(rules map[EventName]Rule) *SingleItem {
|
|
|
return &SingleItem{
|
|
|
rules: rules,
|
|
|
+ vars: make(map[string]string),
|
|
|
}
|
|
|
}
|
|
|
|