51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
package module
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// Module is the interface every scanner module must implement.
|
|
type Module interface {
|
|
// Name returns the unique identifier for this module (e.g. "arp_discovery").
|
|
Name() string
|
|
|
|
// Interval returns how often the scheduler should run this module.
|
|
// A zero duration means the module runs once on startup only.
|
|
Interval() time.Duration
|
|
|
|
// Run executes one scan cycle. It must respect ctx cancellation.
|
|
Run(ctx context.Context) error
|
|
}
|
|
|
|
// Registry holds all registered modules.
|
|
type Registry struct {
|
|
modules []Module
|
|
}
|
|
|
|
// NewRegistry returns an empty module registry.
|
|
func NewRegistry() *Registry {
|
|
return &Registry{}
|
|
}
|
|
|
|
// Register adds a module to the registry.
|
|
func (r *Registry) Register(m Module) {
|
|
r.modules = append(r.modules, m)
|
|
}
|
|
|
|
// All returns all registered modules.
|
|
func (r *Registry) All() []Module {
|
|
return r.modules
|
|
}
|
|
|
|
// Get returns the module with the given name.
|
|
func (r *Registry) Get(name string) (Module, error) {
|
|
for _, m := range r.modules {
|
|
if m.Name() == name {
|
|
return m, nil
|
|
}
|
|
}
|
|
return nil, fmt.Errorf("module %q not registered", name)
|
|
}
|