github.com/netdata/go.d.plugin@v0.58.1/agent/functions/function.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package functions 4 5 import ( 6 "bufio" 7 "bytes" 8 "encoding/csv" 9 "fmt" 10 "strconv" 11 "strings" 12 "time" 13 ) 14 15 type Function struct { 16 key string 17 UID string 18 Timeout time.Duration 19 Name string 20 Args []string 21 Payload []byte 22 } 23 24 func (f *Function) String() string { 25 return fmt.Sprintf("key: %s, uid: %s, timeout: %s, function: %s, args: %v, payload: %s", 26 f.key, f.UID, f.Timeout, f.Name, f.Args, string(f.Payload)) 27 } 28 29 func parseFunction(s string) (*Function, error) { 30 r := csv.NewReader(strings.NewReader(s)) 31 r.Comma = ' ' 32 33 parts, err := r.Read() 34 if err != nil { 35 return nil, err 36 } 37 if len(parts) != 4 { 38 return nil, fmt.Errorf("unexpected number of words: want 4, got %d (%v)", len(parts), parts) 39 } 40 41 timeout, err := strconv.ParseInt(parts[2], 10, 64) 42 if err != nil { 43 return nil, err 44 } 45 46 cmd := strings.Split(parts[3], " ") 47 48 fn := &Function{ 49 key: parts[0], 50 UID: parts[1], 51 Timeout: time.Duration(timeout) * time.Second, 52 Name: cmd[0], 53 Args: cmd[1:], 54 } 55 56 return fn, nil 57 } 58 59 func parseFunctionWithPayload(s string, sc *bufio.Scanner) (*Function, error) { 60 fn, err := parseFunction(s) 61 if err != nil { 62 return nil, err 63 } 64 65 var n int 66 var buf bytes.Buffer 67 for sc.Scan() && sc.Text() != "FUNCTION_PAYLOAD_END" { 68 if n++; n > 1 { 69 buf.WriteString("\n") 70 } 71 buf.WriteString(sc.Text()) 72 } 73 74 fn.Payload = append(fn.Payload, buf.Bytes()...) 75 76 return fn, nil 77 }