Split monolithic scan_updates into individual subsystems (updates/storage/system/docker). Scanners now run in parallel via goroutines - cuts scan time roughly in half, maybe more. Agent changes: - Orchestrator pattern for scanner management - New scanners: storage (disk metrics), system (cpu/mem/processes) - New commands: scan_storage, scan_system, scan_docker - Wrapped existing scanners (APT/DNF/Docker/Windows/Winget) with common interface - Version bump to 0.1.20 Server changes: - Migration 015: agent_subsystems table with trigger for auto-init - Subsystem CRUD: enable/disable, interval (5min-24hr), auto-run toggle - API routes: /api/v1/agents/:id/subsystems/* (9 endpoints) - Stats tracking per subsystem Web UI changes: - ChatTimeline shows subsystem-specific labels and icons - AgentScanners got interactive toggles, interval dropdowns, manual trigger buttons - TypeScript types added for subsystems Backward compatible with legacy scan_updates - for now. Bugs probably exist somewhere.
115 lines
2.9 KiB
Go
115 lines
2.9 KiB
Go
package orchestrator
|
|
|
|
import (
|
|
"github.com/Fimeg/RedFlag/aggregator-agent/internal/client"
|
|
"github.com/Fimeg/RedFlag/aggregator-agent/internal/scanner"
|
|
)
|
|
|
|
// APTScannerWrapper wraps the APT scanner to implement the Scanner interface
|
|
type APTScannerWrapper struct {
|
|
scanner *scanner.APTScanner
|
|
}
|
|
|
|
func NewAPTScannerWrapper(s *scanner.APTScanner) *APTScannerWrapper {
|
|
return &APTScannerWrapper{scanner: s}
|
|
}
|
|
|
|
func (w *APTScannerWrapper) IsAvailable() bool {
|
|
return w.scanner.IsAvailable()
|
|
}
|
|
|
|
func (w *APTScannerWrapper) Scan() ([]client.UpdateReportItem, error) {
|
|
return w.scanner.Scan()
|
|
}
|
|
|
|
func (w *APTScannerWrapper) Name() string {
|
|
return "APT Update Scanner"
|
|
}
|
|
|
|
// DNFScannerWrapper wraps the DNF scanner to implement the Scanner interface
|
|
type DNFScannerWrapper struct {
|
|
scanner *scanner.DNFScanner
|
|
}
|
|
|
|
func NewDNFScannerWrapper(s *scanner.DNFScanner) *DNFScannerWrapper {
|
|
return &DNFScannerWrapper{scanner: s}
|
|
}
|
|
|
|
func (w *DNFScannerWrapper) IsAvailable() bool {
|
|
return w.scanner.IsAvailable()
|
|
}
|
|
|
|
func (w *DNFScannerWrapper) Scan() ([]client.UpdateReportItem, error) {
|
|
return w.scanner.Scan()
|
|
}
|
|
|
|
func (w *DNFScannerWrapper) Name() string {
|
|
return "DNF Update Scanner"
|
|
}
|
|
|
|
// DockerScannerWrapper wraps the Docker scanner to implement the Scanner interface
|
|
type DockerScannerWrapper struct {
|
|
scanner *scanner.DockerScanner
|
|
}
|
|
|
|
func NewDockerScannerWrapper(s *scanner.DockerScanner) *DockerScannerWrapper {
|
|
return &DockerScannerWrapper{scanner: s}
|
|
}
|
|
|
|
func (w *DockerScannerWrapper) IsAvailable() bool {
|
|
if w.scanner == nil {
|
|
return false
|
|
}
|
|
return w.scanner.IsAvailable()
|
|
}
|
|
|
|
func (w *DockerScannerWrapper) Scan() ([]client.UpdateReportItem, error) {
|
|
return w.scanner.Scan()
|
|
}
|
|
|
|
func (w *DockerScannerWrapper) Name() string {
|
|
return "Docker Image Update Scanner"
|
|
}
|
|
|
|
// WindowsUpdateScannerWrapper wraps the Windows Update scanner to implement the Scanner interface
|
|
type WindowsUpdateScannerWrapper struct {
|
|
scanner *scanner.WindowsUpdateScanner
|
|
}
|
|
|
|
func NewWindowsUpdateScannerWrapper(s *scanner.WindowsUpdateScanner) *WindowsUpdateScannerWrapper {
|
|
return &WindowsUpdateScannerWrapper{scanner: s}
|
|
}
|
|
|
|
func (w *WindowsUpdateScannerWrapper) IsAvailable() bool {
|
|
return w.scanner.IsAvailable()
|
|
}
|
|
|
|
func (w *WindowsUpdateScannerWrapper) Scan() ([]client.UpdateReportItem, error) {
|
|
return w.scanner.Scan()
|
|
}
|
|
|
|
func (w *WindowsUpdateScannerWrapper) Name() string {
|
|
return "Windows Update Scanner"
|
|
}
|
|
|
|
// WingetScannerWrapper wraps the Winget scanner to implement the Scanner interface
|
|
type WingetScannerWrapper struct {
|
|
scanner *scanner.WingetScanner
|
|
}
|
|
|
|
func NewWingetScannerWrapper(s *scanner.WingetScanner) *WingetScannerWrapper {
|
|
return &WingetScannerWrapper{scanner: s}
|
|
}
|
|
|
|
func (w *WingetScannerWrapper) IsAvailable() bool {
|
|
return w.scanner.IsAvailable()
|
|
}
|
|
|
|
func (w *WingetScannerWrapper) Scan() ([]client.UpdateReportItem, error) {
|
|
return w.scanner.Scan()
|
|
}
|
|
|
|
func (w *WingetScannerWrapper) Name() string {
|
|
return "Winget Package Update Scanner"
|
|
}
|