master
go 65 lines 1.31 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package openvpn_status_log
4
5 import (
6 "time"
7 )
8
9 func (c *Collector) collect() (map[string]int64, error) {
10 clients, err := parse(c.LogPath)
11 if err != nil {
12 return nil, err
13 }
14
15 mx := make(map[string]int64)
16
17 collectTotalStats(mx, clients)
18
19 if c.perUserMatcher != nil && numOfClients(clients) > 0 {
20 c.collectUsers(mx, clients)
21 }
22
23 return mx, nil
24 }
25
26 func collectTotalStats(mx map[string]int64, clients []clientInfo) {
27 var in, out int64
28 for _, c := range clients {
29 in += c.bytesReceived
30 out += c.bytesSent
31 }
32 mx["clients"] = numOfClients(clients)
33 mx["bytes_in"] = in
34 mx["bytes_out"] = out
35 }
36
37 func (c *Collector) collectUsers(mx map[string]int64, clients []clientInfo) {
38 now := time.Now().Unix()
39
40 for _, user := range clients {
41 name := user.commonName
42 if !c.perUserMatcher.MatchString(name) {
43 continue
44 }
45 if !c.collectedUsers[name] {
46 c.collectedUsers[name] = true
47 if err := c.addUserCharts(name); err != nil {
48 c.Warning(err)
49 }
50 }
51 mx[name+"_bytes_in"] = user.bytesReceived
52 mx[name+"_bytes_out"] = user.bytesSent
53 mx[name+"_connection_time"] = now - user.connectedSince
54 }
55 }
56
57 func numOfClients(clients []clientInfo) int64 {
58 var num int64
59 for _, v := range clients {
60 if v.commonName != "" && v.commonName != "UNDEF" {
61 num++
62 }
63 }
64 return num
65 }