master
go 81 lines 1.55 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package boinc
4
5 import (
6 "context"
7 "fmt"
8 "net"
9 )
10
11 func (c *Collector) collect() (map[string]int64, error) {
12 if c.conn == nil {
13 conn, err := c.establishConn()
14 if err != nil {
15 return nil, err
16 }
17 c.conn = conn
18 }
19
20 results, err := c.conn.getResults()
21 if err != nil {
22 c.Cleanup(context.Background())
23 return nil, err
24 }
25
26 mx := make(map[string]int64)
27
28 if err := c.collectResults(mx, results); err != nil {
29 return nil, err
30 }
31
32 return mx, nil
33 }
34
35 func (c *Collector) collectResults(mx map[string]int64, results []boincReplyResult) error {
36 mx["total"] = int64(len(results))
37 mx["active"] = 0
38
39 for _, v := range resultStateMap {
40 mx[v] = 0
41 }
42 for _, v := range activeTaskStateMap {
43 mx[v] = 0
44 }
45 for _, v := range schedulerStateMap {
46 mx[v] = 0
47 }
48
49 for _, r := range results {
50 mx[r.state()]++
51 if r.ActiveTask != nil {
52 mx["active"]++
53 mx[r.activeTaskState()]++
54 mx[r.schedulerState()]++
55 }
56 }
57
58 return nil
59 }
60
61 func (c *Collector) establishConn() (boincConn, error) {
62 conn := c.newConn(c.Config, c.Logger)
63
64 if err := conn.connect(); err != nil {
65 return nil, fmt.Errorf("failed to establish connection: %w", err)
66 }
67
68 if host, _, err := net.SplitHostPort(c.Address); err == nil {
69 // for the commands we use, authentication is only required for remote connections
70 ip := net.ParseIP(host)
71 if host == "localhost" || (ip != nil && ip.IsLoopback()) {
72 return conn, nil
73 }
74 }
75
76 if err := conn.authenticate(); err != nil {
77 return nil, fmt.Errorf("failed to authenticate: %w", err)
78 }
79
80 return conn, nil
81 }