package core import ( "github.com/projectdiscovery/gologger" "github.com/projectdiscovery/nuclei/v3/pkg/output" "github.com/projectdiscovery/nuclei/v3/pkg/protocols" "github.com/projectdiscovery/nuclei/v3/pkg/types" ) // Engine is an executer for running Nuclei Templates/Workflows. // // 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 // templates to leading to the final execution by the work pool, it is // handled by the engine. type Engine struct { workPool *WorkPool options *types.Options executerOpts *protocols.ExecutorOptions Callback func(*output.ResultEvent) // Executed on results Logger *gologger.Logger } // New returns a new Engine instance func New(options *types.Options) *Engine { engine := &Engine{ options: options, Logger: options.Logger, } engine.workPool = engine.GetWorkPool() return engine } func (e *Engine) GetWorkPoolConfig() WorkPoolConfig { config := WorkPoolConfig{ InputConcurrency: e.options.BulkSize, TypeConcurrency: e.options.TemplateThreads, HeadlessInputConcurrency: e.options.HeadlessBulkSize, HeadlessTypeConcurrency: e.options.HeadlessTemplateThreads, } return config } // GetWorkPool returns a workpool from options func (e *Engine) GetWorkPool() *WorkPool { return NewWorkPool(e.GetWorkPoolConfig()) } // 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.ExecutorOptions) { e.executerOpts = options } // ExecuterOptions returns protocols.ExecutorOptions for nuclei engine. func (e *Engine) ExecuterOptions() *protocols.ExecutorOptions { return e.executerOpts } // WorkPool returns the worker pool for the engine func (e *Engine) WorkPool() *WorkPool { // resize check point - nop if there are no changes e.workPool.RefreshWithConfig(e.GetWorkPoolConfig()) return e.workPool }