- Implemented TopAttackingIPsChart component for visualizing top attacking IPs. - Created hooks for fetching CrowdSec dashboard data including summary, timeline, top IPs, scenarios, and alerts. - Added tests for the new hooks to ensure data fetching works as expected. - Updated translation files for new dashboard terms in multiple languages. - Refactored CrowdSecConfig page to include a tabbed interface for configuration and dashboard views. - Added end-to-end tests for CrowdSec dashboard functionality including tab navigation, data display, and interaction with time range and refresh features.
63 lines
1.0 KiB
Go
63 lines
1.0 KiB
Go
package handlers
|
|
|
|
import (
|
|
"strings"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type cacheEntry struct {
|
|
data interface{}
|
|
expiresAt time.Time
|
|
}
|
|
|
|
type dashboardCache struct {
|
|
mu sync.RWMutex
|
|
entries map[string]*cacheEntry
|
|
}
|
|
|
|
func newDashboardCache() *dashboardCache {
|
|
return &dashboardCache{
|
|
entries: make(map[string]*cacheEntry),
|
|
}
|
|
}
|
|
|
|
func (c *dashboardCache) Get(key string) (interface{}, bool) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
entry, ok := c.entries[key]
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
if time.Now().After(entry.expiresAt) {
|
|
delete(c.entries, key)
|
|
return nil, false
|
|
}
|
|
return entry.data, true
|
|
}
|
|
|
|
func (c *dashboardCache) Set(key string, data interface{}, ttl time.Duration) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
c.entries[key] = &cacheEntry{
|
|
data: data,
|
|
expiresAt: time.Now().Add(ttl),
|
|
}
|
|
}
|
|
|
|
func (c *dashboardCache) Invalidate(prefixes ...string) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
for key := range c.entries {
|
|
for _, prefix := range prefixes {
|
|
if strings.HasPrefix(key, prefix) {
|
|
delete(c.entries, key)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|