Scanner refactor: - Move Name() onto each scanner; drop scanner_wrappers.go, registry.go, scanner_types.go and the duplicate scanner/docker.go (folded into orchestrator/docker_scanner.go) - Add Name() to DNFScanner (was missing — broke orchestrator.Scanner) - dnf_test.go coverage Kernel enforcement (Tier 2 scaffold, wired into loop): - agent/internal/kernel: enforcer, ebpf consumer, windows WDAC stub - config.KernelEnforcementConfig + defaults/merge, wired in loop.go Hash registry (Layer 1) follow-ups: - client GetExpectedHash uses /api/v1/updates/verify-hash - UpdateHandler takes config; computeAndStorePackageHash uses PublicURL Server: - Migration 041: update version_history status constraint - docker reject path writes "ignored" (matches new constraint) - queries/filter.go shared filter helper - updates UI enhancements
79 lines
No EOL
1.7 KiB
Go
79 lines
No EOL
1.7 KiB
Go
package kernel
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
|
|
"github.com/Fimeg/RedFlag/agent/internal/config"
|
|
)
|
|
|
|
type Enforcer interface {
|
|
Start(ctx context.Context) error
|
|
Stop() error
|
|
GetPackageType() string
|
|
}
|
|
|
|
type EnforcerFactory func(*config.Config) (Enforcer, error)
|
|
|
|
var enforcers = map[string]EnforcerFactory{}
|
|
|
|
func RegisterEnforcer(pkgType string, factory EnforcerFactory) {
|
|
enforcers[pkgType] = factory
|
|
}
|
|
|
|
func NewEnforcer(cfg *config.Config) (Enforcer, error) {
|
|
if !cfg.KernelEnforcement.Enabled {
|
|
return &noopEnforcer{}, nil
|
|
}
|
|
|
|
// Determine package type based on platform
|
|
pkgType := "linux"
|
|
if cfg.OS.Type == "windows" {
|
|
pkgType = "windows"
|
|
}
|
|
|
|
if factory, ok := enforcers[pkgType]; ok {
|
|
return factory(cfg)
|
|
}
|
|
|
|
log.Printf("[WARNING] [kernel] unknown_package_type=%s", pkgType)
|
|
return &noopEnforcer{}, nil
|
|
}
|
|
|
|
type noopEnforcer struct{}
|
|
|
|
func (n *noopEnforcer) Start(ctx context.Context) error { return nil }
|
|
func (n *noopEnforcer) Stop() error { return nil }
|
|
func (n *noopEnforcer) GetPackageType() string { return "noop" }
|
|
|
|
type EBPFEnforcer struct {
|
|
consumer *EBPFConsumer
|
|
}
|
|
|
|
func NewEBPFEnforcer(cfg *config.Config) (*EBPFEnforcer, error) {
|
|
consumer, err := NewEBPFConsumer(cfg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &EBPFEnforcer{consumer: consumer}, nil
|
|
}
|
|
|
|
func (e *EBPFEnforcer) Start(ctx context.Context) error {
|
|
return e.consumer.Start()
|
|
}
|
|
|
|
func (e *EBPFEnforcer) Stop() error {
|
|
return e.consumer.Stop()
|
|
}
|
|
|
|
func (e *EBPFEnforcer) GetPackageType() string { return "linux" }
|
|
|
|
func init() {
|
|
RegisterEnforcer("linux", func(cfg *config.Config) (Enforcer, error) {
|
|
consumer, err := NewEBPFConsumer(cfg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &EBPFEnforcer{consumer: consumer}, nil
|
|
})
|
|
} |