nuclei/v2/pkg/core/engine.go

60 lines
1.8 KiB
Go
Raw Normal View History

2021-10-27 11:20:36 +00:00
package core
import (
"github.com/projectdiscovery/nuclei/v2/pkg/protocols"
"github.com/projectdiscovery/nuclei/v2/pkg/types"
)
2021-11-02 20:53:48 +00:00
// Engine is an executer for running Nuclei Templates/Workflows.
2021-10-27 11:20:36 +00:00
//
// The engine contains multiple thread pools which allow using different
// concurrency values per protocol executed.
//
// The engine does most of the heavy lifting of execution, from clustering
2022-02-07 14:41:55 +00:00
// templates to leading to the final execution by the work pool, it is
2021-10-27 11:20:36 +00:00
// handled by the engine.
type Engine struct {
workPool *WorkPool
options *types.Options
executerOpts protocols.ExecuterOptions
}
2021-11-02 20:53:48 +00:00
// InputProvider is an input providing interface for the nuclei execution
2021-10-27 11:20:36 +00:00
// engine.
//
2021-11-02 20:53:48 +00:00
// An example InputProvider implementation is provided in form of hybrid
// input provider in pkg/core/inputs/hybrid/hmap.go
2021-10-27 11:20:36 +00:00
type InputProvider interface {
// Count returns the number of items for input provider
Count() int64
// Scan iterates the input and each found item is passed to the
// callback consumer.
Scan(callback func(value string))
2021-10-27 11:20:36 +00:00
}
// New returns a new Engine instance
func New(options *types.Options) *Engine {
workPool := NewWorkPool(WorkPoolConfig{
InputConcurrency: options.BulkSize,
TypeConcurrency: options.TemplateThreads,
HeadlessInputConcurrency: options.HeadlessBulkSize,
HeadlessTypeConcurrency: options.HeadlessTemplateThreads,
})
engine := &Engine{
options: options,
workPool: workPool,
}
return engine
}
// SetExecuterOptions sets the executer options for the engine. This is required
// before using the engine to perform any execution.
func (e *Engine) SetExecuterOptions(options protocols.ExecuterOptions) {
e.executerOpts = options
}
// ExecuterOptions returns protocols.ExecuterOptions for nuclei engine.
func (e *Engine) ExecuterOptions() protocols.ExecuterOptions {
return e.executerOpts
}