master
go 67 lines 1.49 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package pipeline
4
5 import (
6 "maps"
7 "regexp"
8 "strconv"
9 "text/template"
10
11 "github.com/netdata/netdata/go/plugins/pkg/matcher"
12
13 "github.com/Masterminds/sprig/v3"
14 "github.com/bmatcuk/doublestar/v4"
15 "gopkg.in/yaml.v2"
16 )
17
18 func newFuncMap() template.FuncMap {
19 fm := sprig.TxtFuncMap()
20
21 extra := map[string]any{
22 "match": funcMatchAny,
23 "glob": func(value, pattern string, patterns ...string) bool {
24 return funcMatchAny("glob", value, pattern, patterns...)
25 },
26 "promPort": func(port string) string {
27 v, _ := strconv.Atoi(port)
28 return prometheusPortAllocations[v]
29 },
30 "toYaml": func(v any) (string, error) {
31 bs, err := yaml.Marshal(v)
32 return string(bs), err
33 },
34 }
35
36 maps.Copy(fm, extra)
37
38 return fm
39 }
40
41 func funcMatchAny(typ, value, pattern string, patterns ...string) bool {
42 switch len(patterns) {
43 case 0:
44 return funcMatch(typ, value, pattern)
45 default:
46 return funcMatch(typ, value, pattern) || funcMatchAny(typ, value, patterns[0], patterns[1:]...)
47 }
48 }
49
50 func funcMatch(typ string, value, pattern string) bool {
51 switch typ {
52 case "glob", "":
53 m, err := matcher.NewGlobMatcher(pattern)
54 return err == nil && m.MatchString(value)
55 case "sp":
56 m, err := matcher.NewSimplePatternsMatcher(pattern)
57 return err == nil && m.MatchString(value)
58 case "re":
59 ok, err := regexp.MatchString(pattern, value)
60 return err == nil && ok
61 case "dstar":
62 ok, err := doublestar.Match(pattern, value)
63 return err == nil && ok
64 default:
65 return false
66 }
67 }