Blame


1 58479bf1 2022-12-16 o package nlnet
2 58479bf1 2022-12-16 o
3 58479bf1 2022-12-16 o import (
4 58479bf1 2022-12-16 o "bufio"
5 58479bf1 2022-12-16 o "bytes"
6 58479bf1 2022-12-16 o "fmt"
7 58479bf1 2022-12-16 o "io"
8 58479bf1 2022-12-16 o "os/exec"
9 58479bf1 2022-12-16 o "strconv"
10 58479bf1 2022-12-16 o "strings"
11 58479bf1 2022-12-16 o )
12 58479bf1 2022-12-16 o
13 58479bf1 2022-12-16 o type stat struct {
14 58479bf1 2022-12-16 o name string
15 58479bf1 2022-12-16 o value float64
16 58479bf1 2022-12-16 o }
17 58479bf1 2022-12-16 o
18 58479bf1 2022-12-16 o func parseStats(r io.Reader) (map[string]float64, error) {
19 58479bf1 2022-12-16 o stats := make(map[string]float64)
20 58479bf1 2022-12-16 o sc := bufio.NewScanner(r)
21 58479bf1 2022-12-16 o for sc.Scan() {
22 58479bf1 2022-12-16 o stat, err := parseStat(sc.Text())
23 58479bf1 2022-12-16 o if err != nil {
24 58479bf1 2022-12-16 o return stats, fmt.Errorf("parse stat: %v", err)
25 58479bf1 2022-12-16 o }
26 58479bf1 2022-12-16 o stats[stat.name] = stat.value
27 58479bf1 2022-12-16 o }
28 58479bf1 2022-12-16 o return stats, sc.Err()
29 58479bf1 2022-12-16 o }
30 58479bf1 2022-12-16 o
31 58479bf1 2022-12-16 o func parseStat(line string) (stat, error) {
32 58479bf1 2022-12-16 o k, v, found := strings.Cut(line, "=")
33 58479bf1 2022-12-16 o if !found {
34 58479bf1 2022-12-16 o return stat{}, fmt.Errorf("%q not found", "=")
35 58479bf1 2022-12-16 o }
36 58479bf1 2022-12-16 o f, err := strconv.ParseFloat(v, 64)
37 58479bf1 2022-12-16 o if err != nil {
38 58479bf1 2022-12-16 o return stat{}, fmt.Errorf("parse %s value: %v", k, err)
39 58479bf1 2022-12-16 o }
40 58479bf1 2022-12-16 o return stat{name: k, value: f}, nil
41 58479bf1 2022-12-16 o }
42 58479bf1 2022-12-16 o
43 58479bf1 2022-12-16 o func execForStats(path string) (map[string]float64, error) {
44 58479bf1 2022-12-16 o cmd := exec.Command(path, "stats_noreset")
45 58479bf1 2022-12-16 o buf := &bytes.Buffer{}
46 58479bf1 2022-12-16 o cmd.Stdout = buf
47 58479bf1 2022-12-16 o if err := cmd.Run(); err != nil {
48 58479bf1 2022-12-16 o return nil, err
49 58479bf1 2022-12-16 o }
50 58479bf1 2022-12-16 o return parseStats(buf)
51 58479bf1 2022-12-16 o }
52 58479bf1 2022-12-16 o
53 58479bf1 2022-12-16 o func ReadUnboundStats() (map[string]float64, error) {
54 58479bf1 2022-12-16 o return execForStats("unbound-control")
55 58479bf1 2022-12-16 o }
56 58479bf1 2022-12-16 o
57 58479bf1 2022-12-16 o func ReadNSDStats() (map[string]float64, error) {
58 58479bf1 2022-12-16 o return execForStats("nsd-control")
59 58479bf1 2022-12-16 o }