opensnitch/daemon/statistics/stats.go

280 lines
6.7 KiB
Go
Raw Normal View History

package statistics
import (
"context"
"strconv"
"sync"
"time"
2020-12-09 18:18:42 +01:00
"github.com/evilsocket/opensnitch/daemon/conman"
"github.com/evilsocket/opensnitch/daemon/core"
"github.com/evilsocket/opensnitch/daemon/log"
"github.com/evilsocket/opensnitch/daemon/log/loggers"
2020-12-09 18:18:42 +01:00
"github.com/evilsocket/opensnitch/daemon/rule"
"github.com/evilsocket/opensnitch/daemon/ui/protocol"
)
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
// StatsConfig holds the stats confguration
type StatsConfig struct {
MaxEvents int `json:"MaxEvents"`
MaxStats int `json:"MaxStats"`
Workers int `json:"Workers"`
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
}
type conEvent struct {
con *conman.Connection
match *rule.Rule
wasMissed bool
}
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
// Statistics holds the connections and statistics the daemon intercepts.
// The connections are stored in the Events slice.
type Statistics struct {
ctx context.Context
cancel context.CancelFunc
Started time.Time
logger *loggers.LoggerManager
rules *rule.Loader
ByExecutable map[string]uint64
ByUID map[string]uint64
ByAddress map[string]uint64
ByPort map[string]uint64
ByHost map[string]uint64
ByProto map[string]uint64
jobs chan conEvent
Events []*Event
RuleHits int
Accepted int
Ignored int
Connections int
RuleMisses int
DNSResponses int
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
// max number of events to keep in the buffer
maxEvents int
// max number of entries for each By* map
maxStats int
maxWorkers int
Dropped int
sync.RWMutex
}
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
// New returns a new Statistics object and initializes the go routines to update the stats.
func New(rules *rule.Loader) (stats *Statistics) {
ctx, cancel := context.WithCancel(context.Background())
stats = &Statistics{
ctx: ctx,
cancel: cancel,
Started: time.Now(),
Events: make([]*Event, 0),
ByProto: make(map[string]uint64),
ByAddress: make(map[string]uint64),
ByHost: make(map[string]uint64),
ByPort: make(map[string]uint64),
ByUID: make(map[string]uint64),
ByExecutable: make(map[string]uint64),
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
rules: rules,
jobs: make(chan conEvent),
maxEvents: 150,
maxStats: 25,
}
return stats
}
// SetLoggers sets the configured loggers where we'll write the events.
func (s *Statistics) SetLoggers(loggermgr *loggers.LoggerManager) {
s.Lock()
s.logger = loggermgr
s.Unlock()
}
// SetLimits configures the max events to keep in the backlog before sending
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
// the stats to the UI, or while the UI is not connected.
// if the backlog is full, it'll be shifted by one.
func (s *Statistics) SetLimits(config StatsConfig) {
s.cancel()
s.ctx, s.cancel = context.WithCancel(context.Background())
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
if config.MaxEvents > 0 {
s.maxEvents = config.MaxEvents
}
if config.MaxStats > 0 {
s.maxStats = config.MaxStats
}
s.maxWorkers = config.Workers
if s.maxWorkers == 0 {
s.maxWorkers = 6
}
log.Info("Stats, max events: %d, max stats: %d, max workers: %d", s.maxStats, s.maxEvents, s.maxWorkers)
for i := 0; i < s.maxWorkers; i++ {
go s.eventWorker(i, s.ctx.Done())
}
}
// OnConnectionEvent sends the details of a new connection throughout a channel,
// in order to add the connection to the stats.
func (s *Statistics) OnConnectionEvent(con *conman.Connection, match *rule.Rule, wasMissed bool) {
s.jobs <- conEvent{
con: con,
match: match,
wasMissed: wasMissed,
}
action := "<nil>"
rname := "<nil>"
if match != nil {
action = string(match.Action)
rname = string(match.Name)
}
s.logger.Log(con.Serialize(), action, rname)
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
}
// OnDNSResponse increases the counter of dns and accepted connections.
func (s *Statistics) OnDNSResponse() {
s.Lock()
defer s.Unlock()
s.DNSResponses++
s.Accepted++
}
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
// OnIgnored increases the counter of ignored and accepted connections.
func (s *Statistics) OnIgnored() {
s.Lock()
defer s.Unlock()
s.Ignored++
s.Accepted++
}
func (s *Statistics) incMap(m *map[string]uint64, key string) {
if val, found := (*m)[key]; found == false {
// do we have enough space left?
nElems := len(*m)
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
if nElems >= s.maxStats {
// find the element with less hits
nMin := uint64(9999999999)
minKey := ""
for k, v := range *m {
if v < nMin {
minKey = k
nMin = v
}
}
// remove it
if minKey != "" {
delete(*m, minKey)
}
}
(*m)[key] = 1
} else {
(*m)[key] = val + 1
}
}
func (s *Statistics) eventWorker(id int, done <-chan struct{}) {
log.Debug("Stats worker #%d started.", id)
for true {
select {
case <-done:
goto Exit
case job := <-s.jobs:
s.onConnection(job.con, job.match, job.wasMissed)
}
}
Exit:
log.Debug("stats.worker() %d exited", id)
}
func (s *Statistics) onConnection(con *conman.Connection, match *rule.Rule, wasMissed bool) {
s.Lock()
defer s.Unlock()
s.Connections++
if wasMissed {
s.RuleMisses++
} else {
s.RuleHits++
}
if wasMissed == false && match.Action == rule.Allow {
s.Accepted++
} else {
s.Dropped++
}
s.incMap(&s.ByProto, con.Protocol)
s.incMap(&s.ByAddress, con.DstIP.String())
if con.DstHost != "" {
s.incMap(&s.ByHost, con.DstHost)
}
s.incMap(&s.ByPort, strconv.FormatUint(uint64(con.DstPort), 10))
s.incMap(&s.ByUID, strconv.Itoa(con.Entry.UserId))
s.incMap(&s.ByExecutable, con.Process.Path)
// if we reached the limit, shift everything back
// by one position
nEvents := len(s.Events)
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
if nEvents == s.maxEvents {
s.Events = s.Events[1:]
}
if wasMissed {
return
}
s.Events = append(s.Events, NewEvent(con, match))
}
func (s *Statistics) serializeEvents() []*protocol.Event {
nEvents := len(s.Events)
serialized := make([]*protocol.Event, nEvents)
for i, e := range s.Events {
serialized[i] = e.Serialize()
}
return serialized
}
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
// emptyStats empties the stats once we've sent them to the GUI.
// We don't need them anymore here.
func (s *Statistics) emptyStats() {
s.Lock()
if len(s.Events) > 0 {
s.Events = make([]*Event, 0)
}
s.Unlock()
}
// Serialize returns the collected statistics.
// After return the stats, the Events are emptied, to keep collecting more stats
// and not miss connections.
func (s *Statistics) Serialize() *protocol.Statistics {
s.Lock()
statistics: fixed missed connections Previous behaviour: 1) Before version 1.0.0b the daemon kept a list of processes that had established connections. The list was displayed on the GUI as is, so the maximum number of connections displayed were 100 (hardcoded). 2) When the intercepted connections reached 100, the last entry of the list was removed, and a new one was inserted on the top. After v1.0.0 we started saving connections to a DB on the GUI side, to get rid of the hardcoded connections limit. However, the point 2) was still present that caused some problems: - When the backlog was full we kept inserting and deleting connections from it continuously, one by one. - If there was a connections burst we could end up missing some connections. New behaviour: - The statisics are deleted from the daemon everytime we send them to the GUI, because we don't need them on the daemon anymore. - If the GUI is not connected, the connections will be added to the backlog as in the point 2). - When the backlog reaches the limit, it'll keep deleting the last one in order to insert a new one. - The number of connections to keep on the backlog is configurable. - If the statistics configuration is missing, default values will be 150 (maxEvents) and 25 (maxStats). Notes: If the GUI is saving the data to memory (default), there won't be any noticeable side effect. If the GUI is configured to save the connections to a DB on disk, and the daemon sends all the backlog at once, the GUI may experience a delay and a high CPU spike. This can occur on connecting to the daemon (because the backlog will be full), or when an app sends too many connections per second (like nmap).
2021-08-13 12:18:10 +02:00
defer s.emptyStats()
defer s.Unlock()
return &protocol.Statistics{
DaemonVersion: core.Version,
Rules: uint64(s.rules.NumRules()),
Uptime: uint64(time.Since(s.Started).Seconds()),
DnsResponses: uint64(s.DNSResponses),
Connections: uint64(s.Connections),
Ignored: uint64(s.Ignored),
Accepted: uint64(s.Accepted),
Dropped: uint64(s.Dropped),
RuleHits: uint64(s.RuleHits),
RuleMisses: uint64(s.RuleMisses),
Events: s.serializeEvents(),
ByProto: s.ByProto,
ByAddress: s.ByAddress,
ByHost: s.ByHost,
ByPort: s.ByPort,
ByUid: s.ByUID,
ByExecutable: s.ByExecutable,
}
}