master
go 90 lines 1.72 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package openvpn
4
5 import (
6 "fmt"
7 "time"
8 )
9
10 func (c *Collector) collect() (map[string]int64, error) {
11 var err error
12
13 if err := c.client.Connect(); err != nil {
14 return nil, err
15 }
16 defer func() { _ = c.client.Disconnect() }()
17
18 mx := make(map[string]int64)
19
20 if err = c.collectLoadStats(mx); err != nil {
21 return nil, err
22 }
23
24 if c.perUserMatcher != nil {
25 if err = c.collectUsers(mx); err != nil {
26 return nil, err
27 }
28 }
29
30 return mx, nil
31 }
32
33 func (c *Collector) collectLoadStats(mx map[string]int64) error {
34 stats, err := c.client.LoadStats()
35 if err != nil {
36 return err
37 }
38
39 mx["clients"] = stats.NumOfClients
40 mx["bytes_in"] = stats.BytesIn
41 mx["bytes_out"] = stats.BytesOut
42 return nil
43 }
44
45 func (c *Collector) collectUsers(mx map[string]int64) error {
46 users, err := c.client.Users()
47 if err != nil {
48 return err
49 }
50
51 now := time.Now().Unix()
52 var name string
53
54 for _, user := range users {
55 if user.Username == "UNDEF" {
56 name = user.CommonName
57 } else {
58 name = user.Username
59 }
60
61 if !c.perUserMatcher.MatchString(name) {
62 continue
63 }
64 if !c.collectedUsers[name] {
65 c.collectedUsers[name] = true
66 if err := c.addUserCharts(name); err != nil {
67 c.Warning(err)
68 }
69 }
70 mx[name+"_bytes_received"] = user.BytesReceived
71 mx[name+"_bytes_sent"] = user.BytesSent
72 mx[name+"_connection_time"] = now - user.ConnectedSince
73 }
74 return nil
75 }
76
77 func (c *Collector) addUserCharts(userName string) error {
78 cs := userCharts.Copy()
79
80 for _, chart := range *cs {
81 chart.ID = fmt.Sprintf(chart.ID, userName)
82 chart.Fam = fmt.Sprintf(chart.Fam, userName)
83
84 for _, dim := range chart.Dims {
85 dim.ID = fmt.Sprintf(dim.ID, userName)
86 }
87 chart.MarkNotCreated()
88 }
89 return c.charts.Add(*cs...)
90 }