Module Lifecycle Hooks
Initialize resources and clean up gracefully.
Lifecycle Phases​
Registration → Initialize → Configure → Execute → Cleanup
Initialize()​
One-time setup called before any scans.
Use cases:
- Open persistent connections
- Load data files
- Allocate resources
Example:
func (m *Module) Initialize() error {
    // Open database connection
    db, err := sql.Open("postgres", m.dsn)
    if err != nil {
        return err
    }
    m.db = db
    
    // Load signatures
    m.signatures, err = loadSignatures("signatures.yaml")
    return err
}
Configure()​
Apply scan-specific configuration.
Example:
func (m *Module) Configure(config Config) error {
    m.timeout = config.GetDuration("timeout")
    m.concurrency = config.GetInt("concurrency")
    
    if m.concurrency < 1 {
        return errors.New("concurrency must be >= 1")
    }
    
    return nil
}
Execute()​
Perform module work (called per scan).
Example:
func (m *Module) Execute(ctx context.Context, data DataContext) error {
    // Main module logic
    return nil
}
Cleanup()​
Release resources when module unloads.
Example:
func (m *Module) Cleanup() error {
    if m.db != nil {
        return m.db.Close()
    }
    return nil
}
See Custom Modules for development guide.