master
go 66 lines 1.16 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package tor
4
5 import (
6 "bufio"
7 "bytes"
8 "context"
9 "fmt"
10 "strconv"
11 "strings"
12 )
13
14 func (c *Collector) collect() (map[string]int64, error) {
15 if c.conn == nil {
16 conn, err := c.establishConnection()
17 if err != nil {
18 return nil, err
19 }
20 c.conn = conn
21 }
22
23 mx := make(map[string]int64)
24 if err := c.collectServerInfo(mx); err != nil {
25 c.Cleanup(context.Background())
26 return nil, err
27 }
28
29 return mx, nil
30 }
31
32 func (c *Collector) collectServerInfo(mx map[string]int64) error {
33 resp, err := c.conn.getInfo("traffic/read", "traffic/written", "uptime")
34 if err != nil {
35 return err
36 }
37
38 sc := bufio.NewScanner(bytes.NewReader(resp))
39
40 for sc.Scan() {
41 line := sc.Text()
42
43 key, value, ok := strings.Cut(line, "=")
44 if !ok {
45 return fmt.Errorf("failed to parse metric: %s", line)
46 }
47
48 v, err := strconv.ParseInt(value, 10, 64)
49 if err != nil {
50 return fmt.Errorf("failed to parse metric %s value: %v", line, err)
51 }
52 mx[key] = v
53 }
54
55 return nil
56 }
57
58 func (c *Collector) establishConnection() (controlConn, error) {
59 conn := c.newConn(c.Config)
60
61 if err := conn.connect(); err != nil {
62 return nil, err
63 }
64
65 return conn, nil
66 }