Files
pulse/internal/interfaces/interfaces.go
T
rcourtman 30fa3fd810 feat: add complete Proxmox Mail Gateway (PMG) monitoring support
Add comprehensive PMG monitoring with mail statistics, queue depth tracking,
spam distribution analysis, and quarantine monitoring. Includes full discovery
support and UI consistency improvements across all Proxmox products.

Backend:
- Add pkg/pmg package with complete API client for PMG operations
- Implement mail statistics collection (inbound/outbound, spam, virus, bounces)
- Add queue depth monitoring (active, deferred, hold, incoming queues)
- Support spam score distribution and quarantine totals
- Add PMG-specific discovery logic to differentiate from PVE on port 8006
- Extend mock data generator with realistic PMG instances and metrics
- Add PMG node configuration support in config system

Frontend:
- Create MailGateway.tsx component with detailed PMG dashboard
- Display mail flow statistics with time-series charts
- Show queue depth with color-coded warnings (>50 messages or >30min age)
- Add spam distribution histogram and quarantine status
- Support cluster node status with individual queue monitoring
- Add PMG to network discovery with purple branding and mail icon
- Implement conditional navigation (hide PMG tab when no instances configured)
- Standardize discovery UI controls across PVE/PBS/PMG settings pages

API:
- Add /api/config/pmg endpoints for node configuration
- Support PMG-specific monitoring toggles (mail stats, queues, quarantine)
- Extend system settings with PMG configuration options

Discovery:
- Detect PMG vs PVE on shared port 8006 using /api2/json/statistics/mail endpoint
- Return 'pmg' type for mail gateway servers in discovery results
- Update DiscoveryModal to display PMG servers with appropriate styling

This completes ecosystem monitoring support for all three Proxmox products:
Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
2025-10-10 14:30:51 +00:00

60 lines
2.4 KiB
Go

package interfaces
import (
"context"
"time"
"github.com/rcourtman/pulse-go-rewrite/internal/models"
"github.com/rcourtman/pulse-go-rewrite/internal/types"
)
// StateStore defines the interface for state management
type StateStore interface {
GetSnapshot() models.StateSnapshot
UpdateNodes(nodes []models.Node)
UpdateNodesForInstance(instanceName string, nodes []models.Node)
UpdateVMs(vms []models.VM)
UpdateVMsForInstance(instanceName string, vms []models.VM)
UpdateContainers(containers []models.Container)
UpdateContainersForInstance(instanceName string, containers []models.Container)
UpdateStorage(storage []models.Storage)
UpdateCephClustersForInstance(instanceName string, clusters []models.CephCluster)
UpdatePBSInstances(instances []models.PBSInstance)
UpdatePMGInstances(instances []models.PMGInstance)
SetConnectionHealth(instance string, healthy bool)
}
// WebSocketHub defines the interface for WebSocket hub
type WebSocketHub interface {
BroadcastState(state interface{})
GetClientCount() int
Run(ctx context.Context)
}
// MetricsStore defines the interface for metrics storage
type MetricsStore interface {
AddGuestMetric(guestID string, metricType string, value float64, timestamp time.Time)
AddNodeMetric(nodeID string, metricType string, value float64, timestamp time.Time)
AddStorageMetric(storageID string, metricType string, value float64, timestamp time.Time)
GetGuestMetrics(guestID string, metricType string, duration time.Duration) []types.MetricPoint
GetNodeMetrics(nodeID string, metricType string, duration time.Duration) []types.MetricPoint
GetAllGuestMetrics(guestID string, duration time.Duration) map[string][]types.MetricPoint
GetAllStorageMetrics(storageID string, duration time.Duration) map[string][]types.MetricPoint
Cleanup()
}
// Monitor defines the interface for the monitoring system
type Monitor interface {
Start(ctx context.Context, hub WebSocketHub)
GetState() models.StateSnapshot
GetStartTime() time.Time
GetGuestMetrics(guestID string, duration time.Duration) map[string][]types.MetricPoint
GetNodeMetrics(nodeID string, metricType string, duration time.Duration) []types.MetricPoint
GetStorageMetrics(storageID string, duration time.Duration) map[string][]types.MetricPoint
}
// RateTracker defines the interface for rate tracking
type RateTracker interface {
CalculateRates(guestID string, current types.IOMetrics) (diskRead, diskWrite, netIn, netOut float64)
}