mirror of https://github.com/daffainfo/nuclei.git
"Executer" to "Executor" (#3760)
* Fix spelling of "executer" to "executor" * minor change: use defer file.Close() --------- Co-authored-by: Tarun Koyalwar <tarun@projectdiscovery.io>dev
parent
7d5fa300ee
commit
4d6080f3bc
|
@ -109,8 +109,8 @@ func process() error {
|
||||||
defer os.RemoveAll(tempDir)
|
defer os.RemoveAll(tempDir)
|
||||||
|
|
||||||
client := nvd.NewClientV2()
|
client := nvd.NewClientV2()
|
||||||
catalog := disk.NewCatalog(filepath.Dir(*input))
|
templateCatalog := disk.NewCatalog(filepath.Dir(*input))
|
||||||
paths, err := catalog.GetTemplatePath(*input)
|
paths, err := templateCatalog.GetTemplatePath(*input)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ func process() error {
|
||||||
}
|
}
|
||||||
dataString := string(data)
|
dataString := string(data)
|
||||||
// try to fill max-requests
|
// try to fill max-requests
|
||||||
dataString, err = parseAndAddMaxRequests(catalog, path, dataString)
|
dataString, err = parseAndAddMaxRequests(templateCatalog, path, dataString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
gologger.Error().Msgf("Could not compile max request %s: %s\n", path, err)
|
gologger.Error().Msgf("Could not compile max request %s: %s\n", path, err)
|
||||||
}
|
}
|
||||||
|
@ -291,7 +291,7 @@ func getCVEData(client *nvd.ClientV2, filePath, data string) {
|
||||||
changed = true
|
changed = true
|
||||||
node := config.Nodes[0]
|
node := config.Nodes[0]
|
||||||
for _, match := range node.CpeMatch {
|
for _, match := range node.CpeMatch {
|
||||||
cpeSet[extractVersionlessCpe((match.Criteria))] = true
|
cpeSet[extractVersionlessCpe(match.Criteria)] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -538,7 +538,7 @@ func suggestTagsBasedOnReference(references, currentTags []string) []string {
|
||||||
return newTags
|
return newTags
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cloning struct from nuclei as we don't want any validation
|
// InfoBlock Cloning struct from nuclei as we don't want any validation
|
||||||
type InfoBlock struct {
|
type InfoBlock struct {
|
||||||
Info TemplateInfo `yaml:"info"`
|
Info TemplateInfo `yaml:"info"`
|
||||||
}
|
}
|
||||||
|
@ -618,15 +618,15 @@ func parseAndAddMaxRequests(catalog catalog.Catalog, path, data string) (string,
|
||||||
|
|
||||||
// parseTemplate parses a template and returns the template object
|
// parseTemplate parses a template and returns the template object
|
||||||
func parseTemplate(catalog catalog.Catalog, templatePath string) (*templates.Template, error) {
|
func parseTemplate(catalog catalog.Catalog, templatePath string) (*templates.Template, error) {
|
||||||
executerOpts := protocols.ExecuterOptions{
|
executorOpts := protocols.ExecutorOptions{
|
||||||
Catalog: catalog,
|
Catalog: catalog,
|
||||||
Options: defaultOpts,
|
Options: defaultOpts,
|
||||||
}
|
}
|
||||||
reader, err := executerOpts.Catalog.OpenFile(templatePath)
|
reader, err := executorOpts.Catalog.OpenFile(templatePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
template, err := templates.ParseTemplateFromReader(reader, nil, executerOpts)
|
template, err := templates.ParseTemplateFromReader(reader, nil, executorOpts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -638,7 +638,7 @@ func getInfoStartEnd(data string) (int, int) {
|
||||||
info := strings.Index(data, "info:")
|
info := strings.Index(data, "info:")
|
||||||
var indices []int
|
var indices []int
|
||||||
for _, re := range allTagsRegex {
|
for _, re := range allTagsRegex {
|
||||||
// find the first occurance of the label
|
// find the first occurrence of the label
|
||||||
match := re.FindStringIndex(data)
|
match := re.FindStringIndex(data)
|
||||||
if match != nil {
|
if match != nil {
|
||||||
indices = append(indices, match[0])
|
indices = append(indices, match[0])
|
||||||
|
|
|
@ -99,7 +99,7 @@ func executeNucleiAsCode(templatePath, templateURL string) ([]string, error) {
|
||||||
catalog := disk.NewCatalog(path.Join(home, "nuclei-templates"))
|
catalog := disk.NewCatalog(path.Join(home, "nuclei-templates"))
|
||||||
ratelimiter := ratelimit.New(context.Background(), 150, time.Second)
|
ratelimiter := ratelimit.New(context.Background(), 150, time.Second)
|
||||||
defer ratelimiter.Stop()
|
defer ratelimiter.Stop()
|
||||||
executerOpts := protocols.ExecuterOptions{
|
executerOpts := protocols.ExecutorOptions{
|
||||||
Output: outputWriter,
|
Output: outputWriter,
|
||||||
Options: defaultOpts,
|
Options: defaultOpts,
|
||||||
Progress: mockProgress,
|
Progress: mockProgress,
|
||||||
|
|
|
@ -59,7 +59,7 @@ func main() {
|
||||||
|
|
||||||
home, _ := os.UserHomeDir()
|
home, _ := os.UserHomeDir()
|
||||||
catalog := disk.NewCatalog(path.Join(home, "nuclei-templates"))
|
catalog := disk.NewCatalog(path.Join(home, "nuclei-templates"))
|
||||||
executerOpts := protocols.ExecuterOptions{
|
executerOpts := protocols.ExecutorOptions{
|
||||||
Output: outputWriter,
|
Output: outputWriter,
|
||||||
Options: defaultOpts,
|
Options: defaultOpts,
|
||||||
Progress: mockProgress,
|
Progress: mockProgress,
|
||||||
|
|
|
@ -27,7 +27,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// runStandardEnumeration runs standard enumeration
|
// runStandardEnumeration runs standard enumeration
|
||||||
func (r *Runner) runStandardEnumeration(executerOpts protocols.ExecuterOptions, store *loader.Store, engine *core.Engine) (*atomic.Bool, error) {
|
func (r *Runner) runStandardEnumeration(executerOpts protocols.ExecutorOptions, store *loader.Store, engine *core.Engine) (*atomic.Bool, error) {
|
||||||
if r.options.AutomaticScan {
|
if r.options.AutomaticScan {
|
||||||
return r.executeSmartWorkflowInput(executerOpts, store, engine)
|
return r.executeSmartWorkflowInput(executerOpts, store, engine)
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ import (
|
||||||
"github.com/projectdiscovery/nuclei/v2/pkg/protocols/headless/engine"
|
"github.com/projectdiscovery/nuclei/v2/pkg/protocols/headless/engine"
|
||||||
"github.com/projectdiscovery/nuclei/v2/pkg/protocols/http/httpclientpool"
|
"github.com/projectdiscovery/nuclei/v2/pkg/protocols/http/httpclientpool"
|
||||||
"github.com/projectdiscovery/nuclei/v2/pkg/reporting"
|
"github.com/projectdiscovery/nuclei/v2/pkg/reporting"
|
||||||
json_exporter "github.com/projectdiscovery/nuclei/v2/pkg/reporting/exporters/jsonexporter"
|
"github.com/projectdiscovery/nuclei/v2/pkg/reporting/exporters/jsonexporter"
|
||||||
"github.com/projectdiscovery/nuclei/v2/pkg/reporting/exporters/jsonl"
|
"github.com/projectdiscovery/nuclei/v2/pkg/reporting/exporters/jsonl"
|
||||||
"github.com/projectdiscovery/nuclei/v2/pkg/reporting/exporters/markdown"
|
"github.com/projectdiscovery/nuclei/v2/pkg/reporting/exporters/markdown"
|
||||||
"github.com/projectdiscovery/nuclei/v2/pkg/reporting/exporters/sarif"
|
"github.com/projectdiscovery/nuclei/v2/pkg/reporting/exporters/sarif"
|
||||||
|
@ -70,7 +70,7 @@ type Runner struct {
|
||||||
issuesClient reporting.Client
|
issuesClient reporting.Client
|
||||||
hmapInputProvider *hybrid.Input
|
hmapInputProvider *hybrid.Input
|
||||||
browser *engine.Browser
|
browser *engine.Browser
|
||||||
ratelimiter *ratelimit.Limiter
|
rateLimiter *ratelimit.Limiter
|
||||||
hostErrors hosterrorscache.CacheInterface
|
hostErrors hosterrorscache.CacheInterface
|
||||||
resumeCfg *types.ResumeCfg
|
resumeCfg *types.ResumeCfg
|
||||||
pprofServer *http.Server
|
pprofServer *http.Server
|
||||||
|
@ -80,7 +80,7 @@ type Runner struct {
|
||||||
|
|
||||||
const pprofServerAddress = "127.0.0.1:8086"
|
const pprofServerAddress = "127.0.0.1:8086"
|
||||||
|
|
||||||
// New creates a new client for running enumeration process.
|
// New creates a new client for running the enumeration process.
|
||||||
func New(options *types.Options) (*Runner, error) {
|
func New(options *types.Options) (*Runner, error) {
|
||||||
runner := &Runner{
|
runner := &Runner{
|
||||||
options: options,
|
options: options,
|
||||||
|
@ -109,8 +109,8 @@ func New(options *types.Options) (*Runner, error) {
|
||||||
gologger.Error().Label("custom-templates").Msgf("Failed to create custom templates manager: %s\n", err)
|
gologger.Error().Label("custom-templates").Msgf("Failed to create custom templates manager: %s\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for template updates and update if available
|
// Check for template updates and update if available.
|
||||||
// if custom templates manager is not nil, we will install custom templates if there is fresh installation
|
// If the custom templates manager is not nil, we will install custom templates if there is a fresh installation
|
||||||
tm := &installer.TemplateManager{CustomTemplates: ctm}
|
tm := &installer.TemplateManager{CustomTemplates: ctm}
|
||||||
if err := tm.FreshInstallIfNotExists(); err != nil {
|
if err := tm.FreshInstallIfNotExists(); err != nil {
|
||||||
gologger.Warning().Msgf("failed to install nuclei templates: %s\n", err)
|
gologger.Warning().Msgf("failed to install nuclei templates: %s\n", err)
|
||||||
|
@ -278,7 +278,7 @@ func New(options *types.Options) (*Runner, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = json.Unmarshal([]byte(file), &resumeCfg)
|
err = json.Unmarshal(file, &resumeCfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -313,11 +313,11 @@ func New(options *types.Options) (*Runner, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if options.RateLimitMinute > 0 {
|
if options.RateLimitMinute > 0 {
|
||||||
runner.ratelimiter = ratelimit.New(context.Background(), uint(options.RateLimitMinute), time.Minute)
|
runner.rateLimiter = ratelimit.New(context.Background(), uint(options.RateLimitMinute), time.Minute)
|
||||||
} else if options.RateLimit > 0 {
|
} else if options.RateLimit > 0 {
|
||||||
runner.ratelimiter = ratelimit.New(context.Background(), uint(options.RateLimit), time.Second)
|
runner.rateLimiter = ratelimit.New(context.Background(), uint(options.RateLimit), time.Second)
|
||||||
} else {
|
} else {
|
||||||
runner.ratelimiter = ratelimit.NewUnlimited(context.Background())
|
runner.rateLimiter = ratelimit.NewUnlimited(context.Background())
|
||||||
}
|
}
|
||||||
return runner, nil
|
return runner, nil
|
||||||
}
|
}
|
||||||
|
@ -329,14 +329,12 @@ func createReportingOptions(options *types.Options) (*reporting.Options, error)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "could not open reporting config file")
|
return nil, errors.Wrap(err, "could not open reporting config file")
|
||||||
}
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
reportingOptions = &reporting.Options{}
|
reportingOptions = &reporting.Options{}
|
||||||
if err := yaml.DecodeAndValidate(file, reportingOptions); err != nil {
|
if err := yaml.DecodeAndValidate(file, reportingOptions); err != nil {
|
||||||
file.Close()
|
|
||||||
return nil, errors.Wrap(err, "could not parse reporting config file")
|
return nil, errors.Wrap(err, "could not parse reporting config file")
|
||||||
}
|
}
|
||||||
file.Close()
|
|
||||||
|
|
||||||
Walk(reportingOptions, expandEndVars)
|
Walk(reportingOptions, expandEndVars)
|
||||||
}
|
}
|
||||||
if options.MarkdownExportDirectory != "" {
|
if options.MarkdownExportDirectory != "" {
|
||||||
|
@ -357,10 +355,10 @@ func createReportingOptions(options *types.Options) (*reporting.Options, error)
|
||||||
}
|
}
|
||||||
if options.JSONExport != "" {
|
if options.JSONExport != "" {
|
||||||
if reportingOptions != nil {
|
if reportingOptions != nil {
|
||||||
reportingOptions.JSONExporter = &json_exporter.Options{File: options.JSONExport}
|
reportingOptions.JSONExporter = &jsonexporter.Options{File: options.JSONExport}
|
||||||
} else {
|
} else {
|
||||||
reportingOptions = &reporting.Options{}
|
reportingOptions = &reporting.Options{}
|
||||||
reportingOptions.JSONExporter = &json_exporter.Options{File: options.JSONExport}
|
reportingOptions.JSONExporter = &jsonexporter.Options{File: options.JSONExport}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if options.JSONLExport != "" {
|
if options.JSONLExport != "" {
|
||||||
|
@ -388,8 +386,8 @@ func (r *Runner) Close() {
|
||||||
if r.pprofServer != nil {
|
if r.pprofServer != nil {
|
||||||
_ = r.pprofServer.Shutdown(context.Background())
|
_ = r.pprofServer.Shutdown(context.Background())
|
||||||
}
|
}
|
||||||
if r.ratelimiter != nil {
|
if r.rateLimiter != nil {
|
||||||
r.ratelimiter.Stop()
|
r.rateLimiter.Stop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,15 +412,15 @@ func (r *Runner) RunEnumeration() error {
|
||||||
r.options.ExcludedTemplates = append(r.options.ExcludedTemplates, ignoreFile.Files...)
|
r.options.ExcludedTemplates = append(r.options.ExcludedTemplates, ignoreFile.Files...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the executer options which will be used throughout the execution
|
// Create the executor options which will be used throughout the execution
|
||||||
// stage by the nuclei engine modules.
|
// stage by the nuclei engine modules.
|
||||||
executerOpts := protocols.ExecuterOptions{
|
executorOpts := protocols.ExecutorOptions{
|
||||||
Output: r.output,
|
Output: r.output,
|
||||||
Options: r.options,
|
Options: r.options,
|
||||||
Progress: r.progress,
|
Progress: r.progress,
|
||||||
Catalog: r.catalog,
|
Catalog: r.catalog,
|
||||||
IssuesClient: r.issuesClient,
|
IssuesClient: r.issuesClient,
|
||||||
RateLimiter: r.ratelimiter,
|
RateLimiter: r.rateLimiter,
|
||||||
Interactsh: r.interactsh,
|
Interactsh: r.interactsh,
|
||||||
ProjectFile: r.projectFile,
|
ProjectFile: r.projectFile,
|
||||||
Browser: r.browser,
|
Browser: r.browser,
|
||||||
|
@ -436,19 +434,19 @@ func (r *Runner) RunEnumeration() error {
|
||||||
cache := hosterrorscache.New(r.options.MaxHostError, hosterrorscache.DefaultMaxHostsCount, r.options.TrackError)
|
cache := hosterrorscache.New(r.options.MaxHostError, hosterrorscache.DefaultMaxHostsCount, r.options.TrackError)
|
||||||
cache.SetVerbose(r.options.Verbose)
|
cache.SetVerbose(r.options.Verbose)
|
||||||
r.hostErrors = cache
|
r.hostErrors = cache
|
||||||
executerOpts.HostErrorsCache = cache
|
executorOpts.HostErrorsCache = cache
|
||||||
}
|
}
|
||||||
|
|
||||||
engine := core.New(r.options)
|
executorEngine := core.New(r.options)
|
||||||
engine.SetExecuterOptions(executerOpts)
|
executorEngine.SetExecuterOptions(executorOpts)
|
||||||
|
|
||||||
workflowLoader, err := parsers.NewLoader(&executerOpts)
|
workflowLoader, err := parsers.NewLoader(&executorOpts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Could not create loader.")
|
return errors.Wrap(err, "Could not create loader.")
|
||||||
}
|
}
|
||||||
executerOpts.WorkflowLoader = workflowLoader
|
executorOpts.WorkflowLoader = workflowLoader
|
||||||
|
|
||||||
store, err := loader.New(loader.NewConfig(r.options, r.catalog, executerOpts))
|
store, err := loader.New(loader.NewConfig(r.options, r.catalog, executorOpts))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not load templates from config")
|
return errors.Wrap(err, "could not load templates from config")
|
||||||
}
|
}
|
||||||
|
@ -512,14 +510,14 @@ func (r *Runner) RunEnumeration() error {
|
||||||
r.displayExecutionInfo(store)
|
r.displayExecutionInfo(store)
|
||||||
|
|
||||||
// If not explicitly disabled, check if http based protocols
|
// If not explicitly disabled, check if http based protocols
|
||||||
// are used and if inputs are non-http to pre-perform probing
|
// are used, and if inputs are non-http to pre-perform probing
|
||||||
// of urls and storing them for execution.
|
// of urls and storing them for execution.
|
||||||
if !r.options.DisableHTTPProbe && loader.IsHTTPBasedProtocolUsed(store) && r.isInputNonHTTP() {
|
if !r.options.DisableHTTPProbe && loader.IsHTTPBasedProtocolUsed(store) && r.isInputNonHTTP() {
|
||||||
inputHelpers, err := r.initializeTemplatesHTTPInput()
|
inputHelpers, err := r.initializeTemplatesHTTPInput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not probe http input")
|
return errors.Wrap(err, "could not probe http input")
|
||||||
}
|
}
|
||||||
executerOpts.InputHelper.InputsHTTP = inputHelpers
|
executorOpts.InputHelper.InputsHTTP = inputHelpers
|
||||||
}
|
}
|
||||||
|
|
||||||
enumeration := false
|
enumeration := false
|
||||||
|
@ -570,7 +568,7 @@ func (r *Runner) RunEnumeration() error {
|
||||||
enumeration = true
|
enumeration = true
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
results, err = r.runStandardEnumeration(executerOpts, store, engine)
|
results, err = r.runStandardEnumeration(executorOpts, store, executorEngine)
|
||||||
enumeration = true
|
enumeration = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -586,8 +584,8 @@ func (r *Runner) RunEnumeration() error {
|
||||||
}
|
}
|
||||||
r.progress.Stop()
|
r.progress.Stop()
|
||||||
|
|
||||||
if executerOpts.InputHelper != nil {
|
if executorOpts.InputHelper != nil {
|
||||||
_ = executerOpts.InputHelper.Close()
|
_ = executorOpts.InputHelper.Close()
|
||||||
}
|
}
|
||||||
if r.issuesClient != nil {
|
if r.issuesClient != nil {
|
||||||
r.issuesClient.Close()
|
r.issuesClient.Close()
|
||||||
|
@ -599,7 +597,7 @@ func (r *Runner) RunEnumeration() error {
|
||||||
if r.browser != nil {
|
if r.browser != nil {
|
||||||
r.browser.Close()
|
r.browser.Close()
|
||||||
}
|
}
|
||||||
// check if passive scan was requested but no target was provided
|
// check if a passive scan was requested but no target was provided
|
||||||
if r.options.OfflineHTTP && len(r.options.Targets) == 0 && r.options.TargetsFilePath == "" {
|
if r.options.OfflineHTTP && len(r.options.Targets) == 0 && r.options.TargetsFilePath == "" {
|
||||||
return errors.Wrap(err, "missing required input (http response) to run passive templates")
|
return errors.Wrap(err, "missing required input (http response) to run passive templates")
|
||||||
}
|
}
|
||||||
|
@ -619,11 +617,11 @@ func (r *Runner) isInputNonHTTP() bool {
|
||||||
return nonURLInput
|
return nonURLInput
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Runner) executeSmartWorkflowInput(executerOpts protocols.ExecuterOptions, store *loader.Store, engine *core.Engine) (*atomic.Bool, error) {
|
func (r *Runner) executeSmartWorkflowInput(executorOpts protocols.ExecutorOptions, store *loader.Store, engine *core.Engine) (*atomic.Bool, error) {
|
||||||
r.progress.Init(r.hmapInputProvider.Count(), 0, 0)
|
r.progress.Init(r.hmapInputProvider.Count(), 0, 0)
|
||||||
|
|
||||||
service, err := automaticscan.New(automaticscan.Options{
|
service, err := automaticscan.New(automaticscan.Options{
|
||||||
ExecuterOpts: executerOpts,
|
ExecuterOpts: executorOpts,
|
||||||
Store: store,
|
Store: store,
|
||||||
Engine: engine,
|
Engine: engine,
|
||||||
Target: r.hmapInputProvider,
|
Target: r.hmapInputProvider,
|
||||||
|
@ -676,7 +674,7 @@ func (r *Runner) executeTemplatesInput(store *loader.Store, engine *core.Engine)
|
||||||
workflowCount := len(store.Workflows())
|
workflowCount := len(store.Workflows())
|
||||||
templateCount := originalTemplatesCount + workflowCount
|
templateCount := originalTemplatesCount + workflowCount
|
||||||
|
|
||||||
// 0 matches means no templates were found in directory
|
// 0 matches means no templates were found in the directory
|
||||||
if templateCount == 0 {
|
if templateCount == 0 {
|
||||||
return &atomic.Bool{}, errors.New("no valid templates were found")
|
return &atomic.Bool{}, errors.New("no valid templates were found")
|
||||||
}
|
}
|
||||||
|
@ -726,7 +724,7 @@ type WalkFunc func(reflect.Value, reflect.StructField)
|
||||||
// Walk traverses a struct and executes a callback function on each value in the struct.
|
// Walk traverses a struct and executes a callback function on each value in the struct.
|
||||||
// The interface{} passed to the function should be a pointer to a struct or a struct.
|
// The interface{} passed to the function should be a pointer to a struct or a struct.
|
||||||
// WalkFunc is the callback function used for each value in the struct. It is passed the
|
// WalkFunc is the callback function used for each value in the struct. It is passed the
|
||||||
// reflect.Value and reflect.Type of the value in the struct.
|
// reflect.Value and reflect.Type properties of the value in the struct.
|
||||||
func Walk(s interface{}, callback WalkFunc) {
|
func Walk(s interface{}, callback WalkFunc) {
|
||||||
structValue := reflect.ValueOf(s)
|
structValue := reflect.ValueOf(s)
|
||||||
if structValue.Kind() == reflect.Ptr {
|
if structValue.Kind() == reflect.Ptr {
|
||||||
|
|
|
@ -42,7 +42,7 @@ type Config struct {
|
||||||
IncludeConditions []string
|
IncludeConditions []string
|
||||||
|
|
||||||
Catalog catalog.Catalog
|
Catalog catalog.Catalog
|
||||||
ExecutorOptions protocols.ExecuterOptions
|
ExecutorOptions protocols.ExecutorOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store is a storage for loaded nuclei templates
|
// Store is a storage for loaded nuclei templates
|
||||||
|
@ -64,7 +64,7 @@ type Store struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewConfig returns a new loader config
|
// NewConfig returns a new loader config
|
||||||
func NewConfig(options *types.Options, catalog catalog.Catalog, executerOpts protocols.ExecuterOptions) *Config {
|
func NewConfig(options *types.Options, catalog catalog.Catalog, executerOpts protocols.ExecutorOptions) *Config {
|
||||||
loaderConfig := Config{
|
loaderConfig := Config{
|
||||||
Templates: options.Templates,
|
Templates: options.Templates,
|
||||||
Workflows: options.Workflows,
|
Workflows: options.Workflows,
|
||||||
|
|
|
@ -18,7 +18,7 @@ import (
|
||||||
type Engine struct {
|
type Engine struct {
|
||||||
workPool *WorkPool
|
workPool *WorkPool
|
||||||
options *types.Options
|
options *types.Options
|
||||||
executerOpts protocols.ExecuterOptions
|
executerOpts protocols.ExecutorOptions
|
||||||
Callback func(*output.ResultEvent) // Executed on results
|
Callback func(*output.ResultEvent) // Executed on results
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,12 +58,12 @@ func (e *Engine) GetWorkPool() *WorkPool {
|
||||||
|
|
||||||
// SetExecuterOptions sets the executer options for the engine. This is required
|
// SetExecuterOptions sets the executer options for the engine. This is required
|
||||||
// before using the engine to perform any execution.
|
// before using the engine to perform any execution.
|
||||||
func (e *Engine) SetExecuterOptions(options protocols.ExecuterOptions) {
|
func (e *Engine) SetExecuterOptions(options protocols.ExecutorOptions) {
|
||||||
e.executerOpts = options
|
e.executerOpts = options
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExecuterOptions returns protocols.ExecuterOptions for nuclei engine.
|
// ExecuterOptions returns protocols.ExecutorOptions for nuclei engine.
|
||||||
func (e *Engine) ExecuterOptions() protocols.ExecuterOptions {
|
func (e *Engine) ExecuterOptions() protocols.ExecutorOptions {
|
||||||
return e.executerOpts
|
return e.executerOpts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,9 @@ import (
|
||||||
func TestWorkflowsSimple(t *testing.T) {
|
func TestWorkflowsSimple(t *testing.T) {
|
||||||
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
||||||
|
|
||||||
workflow := &workflows.Workflow{Options: &protocols.ExecuterOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
workflow := &workflows.Workflow{Options: &protocols.ExecutorOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
||||||
{Executers: []*workflows.ProtocolExecuterPair{{
|
{Executers: []*workflows.ProtocolExecuterPair{{
|
||||||
Executer: &mockExecuter{result: true}, Options: &protocols.ExecuterOptions{Progress: progressBar}},
|
Executer: &mockExecuter{result: true}, Options: &protocols.ExecutorOptions{Progress: progressBar}},
|
||||||
}},
|
}},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
@ -32,16 +32,16 @@ func TestWorkflowsSimpleMultiple(t *testing.T) {
|
||||||
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
||||||
|
|
||||||
var firstInput, secondInput string
|
var firstInput, secondInput string
|
||||||
workflow := &workflows.Workflow{Options: &protocols.ExecuterOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
workflow := &workflows.Workflow{Options: &protocols.ExecutorOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
||||||
{Executers: []*workflows.ProtocolExecuterPair{{
|
{Executers: []*workflows.ProtocolExecuterPair{{
|
||||||
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
||||||
firstInput = input.Input
|
firstInput = input.Input
|
||||||
}}, Options: &protocols.ExecuterOptions{Progress: progressBar}},
|
}}, Options: &protocols.ExecutorOptions{Progress: progressBar}},
|
||||||
}},
|
}},
|
||||||
{Executers: []*workflows.ProtocolExecuterPair{{
|
{Executers: []*workflows.ProtocolExecuterPair{{
|
||||||
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
||||||
secondInput = input.Input
|
secondInput = input.Input
|
||||||
}}, Options: &protocols.ExecuterOptions{Progress: progressBar}},
|
}}, Options: &protocols.ExecutorOptions{Progress: progressBar}},
|
||||||
}},
|
}},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
@ -57,17 +57,17 @@ func TestWorkflowsSubtemplates(t *testing.T) {
|
||||||
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
||||||
|
|
||||||
var firstInput, secondInput string
|
var firstInput, secondInput string
|
||||||
workflow := &workflows.Workflow{Options: &protocols.ExecuterOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
workflow := &workflows.Workflow{Options: &protocols.ExecutorOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
||||||
{Executers: []*workflows.ProtocolExecuterPair{{
|
{Executers: []*workflows.ProtocolExecuterPair{{
|
||||||
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
||||||
firstInput = input.Input
|
firstInput = input.Input
|
||||||
}, outputs: []*output.InternalWrappedEvent{
|
}, outputs: []*output.InternalWrappedEvent{
|
||||||
{OperatorsResult: &operators.Result{}, Results: []*output.ResultEvent{{}}},
|
{OperatorsResult: &operators.Result{}, Results: []*output.ResultEvent{{}}},
|
||||||
}}, Options: &protocols.ExecuterOptions{Progress: progressBar}},
|
}}, Options: &protocols.ExecutorOptions{Progress: progressBar}},
|
||||||
}, Subtemplates: []*workflows.WorkflowTemplate{{Executers: []*workflows.ProtocolExecuterPair{{
|
}, Subtemplates: []*workflows.WorkflowTemplate{{Executers: []*workflows.ProtocolExecuterPair{{
|
||||||
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
||||||
secondInput = input.Input
|
secondInput = input.Input
|
||||||
}}, Options: &protocols.ExecuterOptions{Progress: progressBar}},
|
}}, Options: &protocols.ExecutorOptions{Progress: progressBar}},
|
||||||
}}}},
|
}}}},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
@ -83,15 +83,15 @@ func TestWorkflowsSubtemplatesNoMatch(t *testing.T) {
|
||||||
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
||||||
|
|
||||||
var firstInput, secondInput string
|
var firstInput, secondInput string
|
||||||
workflow := &workflows.Workflow{Options: &protocols.ExecuterOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
workflow := &workflows.Workflow{Options: &protocols.ExecutorOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
||||||
{Executers: []*workflows.ProtocolExecuterPair{{
|
{Executers: []*workflows.ProtocolExecuterPair{{
|
||||||
Executer: &mockExecuter{result: false, executeHook: func(input *contextargs.MetaInput) {
|
Executer: &mockExecuter{result: false, executeHook: func(input *contextargs.MetaInput) {
|
||||||
firstInput = input.Input
|
firstInput = input.Input
|
||||||
}}, Options: &protocols.ExecuterOptions{Progress: progressBar}},
|
}}, Options: &protocols.ExecutorOptions{Progress: progressBar}},
|
||||||
}, Subtemplates: []*workflows.WorkflowTemplate{{Executers: []*workflows.ProtocolExecuterPair{{
|
}, Subtemplates: []*workflows.WorkflowTemplate{{Executers: []*workflows.ProtocolExecuterPair{{
|
||||||
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
||||||
secondInput = input.Input
|
secondInput = input.Input
|
||||||
}}, Options: &protocols.ExecuterOptions{Progress: progressBar}},
|
}}, Options: &protocols.ExecutorOptions{Progress: progressBar}},
|
||||||
}}}},
|
}}}},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ func TestWorkflowsSubtemplatesWithMatcher(t *testing.T) {
|
||||||
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
||||||
|
|
||||||
var firstInput, secondInput string
|
var firstInput, secondInput string
|
||||||
workflow := &workflows.Workflow{Options: &protocols.ExecuterOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
workflow := &workflows.Workflow{Options: &protocols.ExecutorOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
||||||
{Executers: []*workflows.ProtocolExecuterPair{{
|
{Executers: []*workflows.ProtocolExecuterPair{{
|
||||||
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
||||||
firstInput = input.Input
|
firstInput = input.Input
|
||||||
|
@ -116,11 +116,11 @@ func TestWorkflowsSubtemplatesWithMatcher(t *testing.T) {
|
||||||
Matches: map[string][]string{"tomcat": {}},
|
Matches: map[string][]string{"tomcat": {}},
|
||||||
Extracts: map[string][]string{},
|
Extracts: map[string][]string{},
|
||||||
}},
|
}},
|
||||||
}}, Options: &protocols.ExecuterOptions{Progress: progressBar}},
|
}}, Options: &protocols.ExecutorOptions{Progress: progressBar}},
|
||||||
}, Matchers: []*workflows.Matcher{{Name: stringslice.StringSlice{Value: "tomcat"}, Subtemplates: []*workflows.WorkflowTemplate{{Executers: []*workflows.ProtocolExecuterPair{{
|
}, Matchers: []*workflows.Matcher{{Name: stringslice.StringSlice{Value: "tomcat"}, Subtemplates: []*workflows.WorkflowTemplate{{Executers: []*workflows.ProtocolExecuterPair{{
|
||||||
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
||||||
secondInput = input.Input
|
secondInput = input.Input
|
||||||
}}, Options: &protocols.ExecuterOptions{Progress: progressBar}},
|
}}, Options: &protocols.ExecutorOptions{Progress: progressBar}},
|
||||||
}}}}}},
|
}}}}}},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ func TestWorkflowsSubtemplatesWithMatcherNoMatch(t *testing.T) {
|
||||||
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
progressBar, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
||||||
|
|
||||||
var firstInput, secondInput string
|
var firstInput, secondInput string
|
||||||
workflow := &workflows.Workflow{Options: &protocols.ExecuterOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
workflow := &workflows.Workflow{Options: &protocols.ExecutorOptions{Options: &types.Options{TemplateThreads: 10}}, Workflows: []*workflows.WorkflowTemplate{
|
||||||
{Executers: []*workflows.ProtocolExecuterPair{{
|
{Executers: []*workflows.ProtocolExecuterPair{{
|
||||||
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
||||||
firstInput = input.Input
|
firstInput = input.Input
|
||||||
|
@ -145,11 +145,11 @@ func TestWorkflowsSubtemplatesWithMatcherNoMatch(t *testing.T) {
|
||||||
Matches: map[string][]string{"tomcat": {}},
|
Matches: map[string][]string{"tomcat": {}},
|
||||||
Extracts: map[string][]string{},
|
Extracts: map[string][]string{},
|
||||||
}},
|
}},
|
||||||
}}, Options: &protocols.ExecuterOptions{Progress: progressBar}},
|
}}, Options: &protocols.ExecutorOptions{Progress: progressBar}},
|
||||||
}, Matchers: []*workflows.Matcher{{Name: stringslice.StringSlice{Value: "apache"}, Subtemplates: []*workflows.WorkflowTemplate{{Executers: []*workflows.ProtocolExecuterPair{{
|
}, Matchers: []*workflows.Matcher{{Name: stringslice.StringSlice{Value: "apache"}, Subtemplates: []*workflows.WorkflowTemplate{{Executers: []*workflows.ProtocolExecuterPair{{
|
||||||
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
Executer: &mockExecuter{result: true, executeHook: func(input *contextargs.MetaInput) {
|
||||||
secondInput = input.Input
|
secondInput = input.Input
|
||||||
}}, Options: &protocols.ExecuterOptions{Progress: progressBar}},
|
}}, Options: &protocols.ExecutorOptions{Progress: progressBar}},
|
||||||
}}}}}},
|
}}}}}},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
|
@ -11,11 +11,11 @@ import (
|
||||||
type workflowLoader struct {
|
type workflowLoader struct {
|
||||||
pathFilter *filter.PathFilter
|
pathFilter *filter.PathFilter
|
||||||
tagFilter *filter.TagFilter
|
tagFilter *filter.TagFilter
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewLoader returns a new workflow loader structure
|
// NewLoader returns a new workflow loader structure
|
||||||
func NewLoader(options *protocols.ExecuterOptions) (model.WorkflowLoader, error) {
|
func NewLoader(options *protocols.ExecutorOptions) (model.WorkflowLoader, error) {
|
||||||
tagFilter, err := filter.New(&filter.Config{
|
tagFilter, err := filter.New(&filter.Config{
|
||||||
Authors: options.Options.Authors,
|
Authors: options.Options.Authors,
|
||||||
Tags: options.Options.Tags,
|
Tags: options.Options.Tags,
|
||||||
|
|
|
@ -26,7 +26,7 @@ import (
|
||||||
|
|
||||||
// Service is a service for automatic scan execution
|
// Service is a service for automatic scan execution
|
||||||
type Service struct {
|
type Service struct {
|
||||||
opts protocols.ExecuterOptions
|
opts protocols.ExecutorOptions
|
||||||
store *loader.Store
|
store *loader.Store
|
||||||
engine *core.Engine
|
engine *core.Engine
|
||||||
target core.InputProvider
|
target core.InputProvider
|
||||||
|
@ -41,7 +41,7 @@ type Service struct {
|
||||||
|
|
||||||
// Options contains configuration options for automatic scan service
|
// Options contains configuration options for automatic scan service
|
||||||
type Options struct {
|
type Options struct {
|
||||||
ExecuterOpts protocols.ExecuterOptions
|
ExecuterOpts protocols.ExecutorOptions
|
||||||
Store *loader.Store
|
Store *loader.Store
|
||||||
Engine *core.Engine
|
Engine *core.Engine
|
||||||
Target core.InputProvider
|
Target core.InputProvider
|
||||||
|
|
|
@ -18,13 +18,13 @@ import (
|
||||||
// Executer executes a group of requests for a protocol
|
// Executer executes a group of requests for a protocol
|
||||||
type Executer struct {
|
type Executer struct {
|
||||||
requests []protocols.Request
|
requests []protocols.Request
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ protocols.Executer = &Executer{}
|
var _ protocols.Executer = &Executer{}
|
||||||
|
|
||||||
// NewExecuter creates a new request executer for list of requests
|
// NewExecuter creates a new request executer for list of requests
|
||||||
func NewExecuter(requests []protocols.Request, options *protocols.ExecuterOptions) *Executer {
|
func NewExecuter(requests []protocols.Request, options *protocols.ExecutorOptions) *Executer {
|
||||||
return &Executer{requests: requests, options: options}
|
return &Executer{requests: requests, options: options}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ type Request struct {
|
||||||
|
|
||||||
CompiledOperators *operators.Operators `yaml:"-"`
|
CompiledOperators *operators.Operators `yaml:"-"`
|
||||||
dnsClient *retryabledns.Client
|
dnsClient *retryabledns.Client
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
|
|
||||||
// cache any variables that may be needed for operation.
|
// cache any variables that may be needed for operation.
|
||||||
class uint16
|
class uint16
|
||||||
|
@ -122,12 +122,12 @@ func (request *Request) GetID() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Options returns executer options for http request
|
// Options returns executer options for http request
|
||||||
func (r *Request) Options() *protocols.ExecuterOptions {
|
func (r *Request) Options() *protocols.ExecutorOptions {
|
||||||
return r.options
|
return r.options
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile compiles the protocol request for further execution.
|
// Compile compiles the protocol request for further execution.
|
||||||
func (request *Request) Compile(options *protocols.ExecuterOptions) error {
|
func (request *Request) Compile(options *protocols.ExecutorOptions) error {
|
||||||
if request.Retries == 0 {
|
if request.Retries == 0 {
|
||||||
request.Retries = 3
|
request.Retries = 3
|
||||||
}
|
}
|
||||||
|
@ -180,7 +180,7 @@ func (request *Request) Compile(options *protocols.ExecuterOptions) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (request *Request) getDnsClient(options *protocols.ExecuterOptions, metadata map[string]interface{}) (*retryabledns.Client, error) {
|
func (request *Request) getDnsClient(options *protocols.ExecutorOptions, metadata map[string]interface{}) (*retryabledns.Client, error) {
|
||||||
dnsClientOptions := &dnsclientpool.Configuration{
|
dnsClientOptions := &dnsclientpool.Configuration{
|
||||||
Retries: request.Retries,
|
Retries: request.Retries,
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,7 +184,7 @@ func (request *Request) parseDNSInput(host string) (string, error) {
|
||||||
return host, nil
|
return host, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func dumpResponse(event *output.InternalWrappedEvent, request *Request, requestOptions *protocols.ExecuterOptions, response, domain string) {
|
func dumpResponse(event *output.InternalWrappedEvent, request *Request, requestOptions *protocols.ExecutorOptions, response, domain string) {
|
||||||
cliOptions := request.options.Options
|
cliOptions := request.options.Options
|
||||||
if cliOptions.Debug || cliOptions.DebugResponse || cliOptions.StoreResponse {
|
if cliOptions.Debug || cliOptions.DebugResponse || cliOptions.StoreResponse {
|
||||||
hexDump := false
|
hexDump := false
|
||||||
|
@ -203,7 +203,7 @@ func dumpResponse(event *output.InternalWrappedEvent, request *Request, requestO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func dumpTraceData(event *output.InternalWrappedEvent, requestOptions *protocols.ExecuterOptions, traceData, domain string) {
|
func dumpTraceData(event *output.InternalWrappedEvent, requestOptions *protocols.ExecutorOptions, traceData, domain string) {
|
||||||
cliOptions := requestOptions.Options
|
cliOptions := requestOptions.Options
|
||||||
if cliOptions.Debug || cliOptions.DebugResponse {
|
if cliOptions.Debug || cliOptions.DebugResponse {
|
||||||
hexDump := false
|
hexDump := false
|
||||||
|
|
|
@ -60,7 +60,7 @@ type Request struct {
|
||||||
CompiledOperators *operators.Operators `yaml:"-" json:"-"`
|
CompiledOperators *operators.Operators `yaml:"-" json:"-"`
|
||||||
|
|
||||||
// cache any variables that may be needed for operation.
|
// cache any variables that may be needed for operation.
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
mimeTypesChecks []string
|
mimeTypesChecks []string
|
||||||
extensions map[string]struct{}
|
extensions map[string]struct{}
|
||||||
denyList map[string]struct{}
|
denyList map[string]struct{}
|
||||||
|
@ -98,7 +98,7 @@ func (request *Request) GetID() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile compiles the protocol request for further execution.
|
// Compile compiles the protocol request for further execution.
|
||||||
func (request *Request) Compile(options *protocols.ExecuterOptions) error {
|
func (request *Request) Compile(options *protocols.ExecutorOptions) error {
|
||||||
// if there are no matchers/extractors, we trigger an error as no operation would be performed on the template
|
// if there are no matchers/extractors, we trigger an error as no operation would be performed on the template
|
||||||
if request.Operators.IsEmpty() {
|
if request.Operators.IsEmpty() {
|
||||||
return errors.New("empty operators")
|
return errors.New("empty operators")
|
||||||
|
|
|
@ -323,7 +323,7 @@ func (request *Request) buildEvent(input, filePath string, fileMatches []FileMat
|
||||||
return event
|
return event
|
||||||
}
|
}
|
||||||
|
|
||||||
func dumpResponse(event *output.InternalWrappedEvent, requestOptions *protocols.ExecuterOptions, filematches []FileMatch, filePath string) {
|
func dumpResponse(event *output.InternalWrappedEvent, requestOptions *protocols.ExecutorOptions, filematches []FileMatch, filePath string) {
|
||||||
cliOptions := requestOptions.Options
|
cliOptions := requestOptions.Options
|
||||||
if cliOptions.Debug || cliOptions.DebugResponse {
|
if cliOptions.Debug || cliOptions.DebugResponse {
|
||||||
for _, fileMatch := range filematches {
|
for _, fileMatch := range filematches {
|
||||||
|
|
|
@ -52,7 +52,7 @@ type Request struct {
|
||||||
CompiledOperators *operators.Operators `yaml:"-" json:"-"`
|
CompiledOperators *operators.Operators `yaml:"-" json:"-"`
|
||||||
|
|
||||||
// cache any variables that may be needed for operation.
|
// cache any variables that may be needed for operation.
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
generator *generators.PayloadGenerator
|
generator *generators.PayloadGenerator
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ func (request *Request) GetID() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile compiles the protocol request for further execution.
|
// Compile compiles the protocol request for further execution.
|
||||||
func (request *Request) Compile(options *protocols.ExecuterOptions) error {
|
func (request *Request) Compile(options *protocols.ExecutorOptions) error {
|
||||||
// TODO: logic similar to network + http => probably can be refactored
|
// TODO: logic similar to network + http => probably can be refactored
|
||||||
// Resolve payload paths from vars if they exists
|
// Resolve payload paths from vars if they exists
|
||||||
for name, payload := range options.Options.Vars.AsMap() {
|
for name, payload := range options.Options.Vars.AsMap() {
|
||||||
|
|
|
@ -159,7 +159,7 @@ func (request *Request) executeRequestWithPayloads(inputURL string, payloads map
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func dumpResponse(event *output.InternalWrappedEvent, requestOptions *protocols.ExecuterOptions, responseBody string, input string) {
|
func dumpResponse(event *output.InternalWrappedEvent, requestOptions *protocols.ExecutorOptions, responseBody string, input string) {
|
||||||
cliOptions := requestOptions.Options
|
cliOptions := requestOptions.Options
|
||||||
if cliOptions.Debug || cliOptions.DebugResponse {
|
if cliOptions.Debug || cliOptions.DebugResponse {
|
||||||
highlightedResponse := responsehighlighter.Highlight(event.OperatorsResult, responseBody, cliOptions.NoColor, false)
|
highlightedResponse := responsehighlighter.Highlight(event.OperatorsResult, responseBody, cliOptions.NoColor, false)
|
||||||
|
|
|
@ -87,7 +87,7 @@ func (rule *Rule) executeRuleValues(input *ExecuteRuleInput) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile compiles a fuzzing rule and initializes it for operation
|
// Compile compiles a fuzzing rule and initializes it for operation
|
||||||
func (rule *Rule) Compile(generator *generators.PayloadGenerator, options *protocols.ExecuterOptions) error {
|
func (rule *Rule) Compile(generator *generators.PayloadGenerator, options *protocols.ExecutorOptions) error {
|
||||||
// If a payload generator is specified from base request, use it
|
// If a payload generator is specified from base request, use it
|
||||||
// for payload values.
|
// for payload values.
|
||||||
if generator != nil {
|
if generator != nil {
|
||||||
|
|
|
@ -73,7 +73,7 @@ type Rule struct {
|
||||||
// []string{"{{ssrf}}", "{{interactsh-url}}", "example-value"}
|
// []string{"{{ssrf}}", "{{interactsh-url}}", "example-value"}
|
||||||
Fuzz []string `yaml:"fuzz,omitempty" json:"fuzz,omitempty" jsonschema:"title=payloads of fuzz rule,description=Payloads to perform fuzzing substitutions with"`
|
Fuzz []string `yaml:"fuzz,omitempty" json:"fuzz,omitempty" jsonschema:"title=payloads of fuzz rule,description=Payloads to perform fuzzing substitutions with"`
|
||||||
|
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
generator *generators.PayloadGenerator
|
generator *generators.PayloadGenerator
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
|
|
||||||
func TestExecuteQueryPartRule(t *testing.T) {
|
func TestExecuteQueryPartRule(t *testing.T) {
|
||||||
parsed, _ := urlutil.Parse("http://localhost:8080/?url=localhost&mode=multiple&file=passwdfile")
|
parsed, _ := urlutil.Parse("http://localhost:8080/?url=localhost&mode=multiple&file=passwdfile")
|
||||||
options := &protocols.ExecuterOptions{
|
options := &protocols.ExecutorOptions{
|
||||||
Interactsh: &interactsh.Client{},
|
Interactsh: &interactsh.Client{},
|
||||||
}
|
}
|
||||||
t.Run("single", func(t *testing.T) {
|
t.Run("single", func(t *testing.T) {
|
||||||
|
|
|
@ -124,7 +124,7 @@ type Request struct {
|
||||||
|
|
||||||
CompiledOperators *operators.Operators `yaml:"-" json:"-"`
|
CompiledOperators *operators.Operators `yaml:"-" json:"-"`
|
||||||
|
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
connConfiguration *httpclientpool.Configuration
|
connConfiguration *httpclientpool.Configuration
|
||||||
totalRequests int
|
totalRequests int
|
||||||
customHeaders map[string]string
|
customHeaders map[string]string
|
||||||
|
@ -200,7 +200,7 @@ type Request struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Options returns executer options for http request
|
// Options returns executer options for http request
|
||||||
func (r *Request) Options() *protocols.ExecuterOptions {
|
func (r *Request) Options() *protocols.ExecutorOptions {
|
||||||
return r.options
|
return r.options
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,7 +236,7 @@ func (request *Request) isRaw() bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile compiles the protocol request for further execution.
|
// Compile compiles the protocol request for further execution.
|
||||||
func (request *Request) Compile(options *protocols.ExecuterOptions) error {
|
func (request *Request) Compile(options *protocols.ExecutorOptions) error {
|
||||||
if err := request.validate(); err != nil {
|
if err := request.validate(); err != nil {
|
||||||
return errors.Wrap(err, "validation error")
|
return errors.Wrap(err, "validation error")
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ type requestGenerator struct {
|
||||||
currentPayloads map[string]interface{}
|
currentPayloads map[string]interface{}
|
||||||
okCurrentPayload bool
|
okCurrentPayload bool
|
||||||
request *Request
|
request *Request
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
payloadIterator *generators.Iterator
|
payloadIterator *generators.Iterator
|
||||||
interactshURLs []string
|
interactshURLs []string
|
||||||
onceFlow map[string]struct{}
|
onceFlow map[string]struct{}
|
||||||
|
|
|
@ -73,7 +73,7 @@ type Request struct {
|
||||||
generator *generators.PayloadGenerator
|
generator *generators.PayloadGenerator
|
||||||
// cache any variables that may be needed for operation.
|
// cache any variables that may be needed for operation.
|
||||||
dialer *fastdialer.Dialer
|
dialer *fastdialer.Dialer
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
// RequestPartDefinitions contains a mapping of request part definitions and their
|
// RequestPartDefinitions contains a mapping of request part definitions and their
|
||||||
|
@ -138,7 +138,7 @@ func (request *Request) GetID() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile compiles the protocol request for further execution.
|
// Compile compiles the protocol request for further execution.
|
||||||
func (request *Request) Compile(options *protocols.ExecuterOptions) error {
|
func (request *Request) Compile(options *protocols.ExecutorOptions) error {
|
||||||
var shouldUseTLS bool
|
var shouldUseTLS bool
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
|
|
||||||
// Request is a offline http response processing request
|
// Request is a offline http response processing request
|
||||||
type Request struct {
|
type Request struct {
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
compiledOperators []*operators.Operators
|
compiledOperators []*operators.Operators
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ func (request *Request) GetID() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile compiles the protocol request for further execution.
|
// Compile compiles the protocol request for further execution.
|
||||||
func (request *Request) Compile(options *protocols.ExecuterOptions) error {
|
func (request *Request) Compile(options *protocols.ExecutorOptions) error {
|
||||||
for _, operator := range options.Operators {
|
for _, operator := range options.Operators {
|
||||||
if err := operator.Compile(); err != nil {
|
if err := operator.Compile(); err != nil {
|
||||||
return errors.Wrap(err, "could not compile operators")
|
return errors.Wrap(err, "could not compile operators")
|
||||||
|
|
|
@ -37,8 +37,8 @@ type Executer interface {
|
||||||
ExecuteWithResults(input *contextargs.Context, callback OutputEventCallback) error
|
ExecuteWithResults(input *contextargs.Context, callback OutputEventCallback) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExecuterOptions contains the configuration options for executer clients
|
// ExecutorOptions contains the configuration options for executer clients
|
||||||
type ExecuterOptions struct {
|
type ExecutorOptions struct {
|
||||||
// TemplateID is the ID of the template for the request
|
// TemplateID is the ID of the template for the request
|
||||||
TemplateID string
|
TemplateID string
|
||||||
// TemplatePath is the path of the template for the request
|
// TemplatePath is the path of the template for the request
|
||||||
|
@ -88,7 +88,7 @@ type ExecuterOptions struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy returns a copy of the executeroptions structure
|
// Copy returns a copy of the executeroptions structure
|
||||||
func (e ExecuterOptions) Copy() ExecuterOptions {
|
func (e ExecutorOptions) Copy() ExecutorOptions {
|
||||||
copy := e
|
copy := e
|
||||||
return copy
|
return copy
|
||||||
}
|
}
|
||||||
|
@ -96,7 +96,7 @@ func (e ExecuterOptions) Copy() ExecuterOptions {
|
||||||
// Request is an interface implemented any protocol based request generator.
|
// Request is an interface implemented any protocol based request generator.
|
||||||
type Request interface {
|
type Request interface {
|
||||||
// Compile compiles the request generators preparing any requests possible.
|
// Compile compiles the request generators preparing any requests possible.
|
||||||
Compile(options *ExecuterOptions) error
|
Compile(options *ExecutorOptions) error
|
||||||
// Requests returns the total number of requests the rule will perform
|
// Requests returns the total number of requests the rule will perform
|
||||||
Requests() int
|
Requests() int
|
||||||
// GetID returns the ID for the request if any. IDs are used for multi-request
|
// GetID returns the ID for the request if any. IDs are used for multi-request
|
||||||
|
|
|
@ -78,7 +78,7 @@ type Request struct {
|
||||||
// cache any variables that may be needed for operation.
|
// cache any variables that may be needed for operation.
|
||||||
dialer *fastdialer.Dialer
|
dialer *fastdialer.Dialer
|
||||||
tlsx *tlsx.Service
|
tlsx *tlsx.Service
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
// CanCluster returns true if the request can be clustered.
|
// CanCluster returns true if the request can be clustered.
|
||||||
|
@ -93,7 +93,7 @@ func (request *Request) CanCluster(other *Request) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile compiles the request generators preparing any requests possible.
|
// Compile compiles the request generators preparing any requests possible.
|
||||||
func (request *Request) Compile(options *protocols.ExecuterOptions) error {
|
func (request *Request) Compile(options *protocols.ExecutorOptions) error {
|
||||||
request.options = options
|
request.options = options
|
||||||
|
|
||||||
client, err := networkclientpool.Get(options.Options, &networkclientpool.Configuration{})
|
client, err := networkclientpool.Get(options.Options, &networkclientpool.Configuration{})
|
||||||
|
@ -155,7 +155,7 @@ func (request *Request) Compile(options *protocols.ExecuterOptions) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Options returns executer options for http request
|
// Options returns executer options for http request
|
||||||
func (r *Request) Options() *protocols.ExecuterOptions {
|
func (r *Request) Options() *protocols.ExecutorOptions {
|
||||||
return r.options
|
return r.options
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ type Request struct {
|
||||||
|
|
||||||
// cache any variables that may be needed for operation.
|
// cache any variables that may be needed for operation.
|
||||||
dialer *fastdialer.Dialer
|
dialer *fastdialer.Dialer
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
// Input is an input for the websocket protocol
|
// Input is an input for the websocket protocol
|
||||||
|
@ -96,7 +96,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// Compile compiles the request generators preparing any requests possible.
|
// Compile compiles the request generators preparing any requests possible.
|
||||||
func (request *Request) Compile(options *protocols.ExecuterOptions) error {
|
func (request *Request) Compile(options *protocols.ExecutorOptions) error {
|
||||||
request.options = options
|
request.options = options
|
||||||
|
|
||||||
client, err := networkclientpool.Get(options.Options, &networkclientpool.Configuration{})
|
client, err := networkclientpool.Get(options.Options, &networkclientpool.Configuration{})
|
||||||
|
|
|
@ -46,12 +46,12 @@ type Request struct {
|
||||||
Server string `yaml:"server,omitempty" json:"server,omitempty" jsonschema:"title=server url to execute the WHOIS request on,description=Server contains the server url to execute the WHOIS request on"`
|
Server string `yaml:"server,omitempty" json:"server,omitempty" jsonschema:"title=server url to execute the WHOIS request on,description=Server contains the server url to execute the WHOIS request on"`
|
||||||
// cache any variables that may be needed for operation.
|
// cache any variables that may be needed for operation.
|
||||||
client *rdap.Client
|
client *rdap.Client
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
parsedServerURL *url.URL
|
parsedServerURL *url.URL
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile compiles the request generators preparing any requests possible.
|
// Compile compiles the request generators preparing any requests possible.
|
||||||
func (request *Request) Compile(options *protocols.ExecuterOptions) error {
|
func (request *Request) Compile(options *protocols.ExecutorOptions) error {
|
||||||
var err error
|
var err error
|
||||||
if request.Server != "" {
|
if request.Server != "" {
|
||||||
request.parsedServerURL, err = url.Parse(request.Server)
|
request.parsedServerURL, err = url.Parse(request.Server)
|
||||||
|
|
|
@ -113,7 +113,7 @@ func ClusterID(templates []*Template) string {
|
||||||
return cryptoutil.SHA256Sum(ids)
|
return cryptoutil.SHA256Sum(ids)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ClusterTemplates(templatesList []*Template, options protocols.ExecuterOptions) ([]*Template, int) {
|
func ClusterTemplates(templatesList []*Template, options protocols.ExecutorOptions) ([]*Template, int) {
|
||||||
if options.Options.OfflineHTTP || options.Options.DisableClustering {
|
if options.Options.OfflineHTTP || options.Options.DisableClustering {
|
||||||
return templatesList, 0
|
return templatesList, 0
|
||||||
}
|
}
|
||||||
|
@ -164,7 +164,7 @@ type ClusterExecuter struct {
|
||||||
requests protocols.Request
|
requests protocols.Request
|
||||||
operators []*clusteredOperator
|
operators []*clusteredOperator
|
||||||
templateType types.ProtocolType
|
templateType types.ProtocolType
|
||||||
options *protocols.ExecuterOptions
|
options *protocols.ExecutorOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
type clusteredOperator struct {
|
type clusteredOperator struct {
|
||||||
|
@ -177,7 +177,7 @@ type clusteredOperator struct {
|
||||||
var _ protocols.Executer = &ClusterExecuter{}
|
var _ protocols.Executer = &ClusterExecuter{}
|
||||||
|
|
||||||
// NewClusterExecuter creates a new request executer for list of requests
|
// NewClusterExecuter creates a new request executer for list of requests
|
||||||
func NewClusterExecuter(requests []*Template, options *protocols.ExecuterOptions) *ClusterExecuter {
|
func NewClusterExecuter(requests []*Template, options *protocols.ExecutorOptions) *ClusterExecuter {
|
||||||
executer := &ClusterExecuter{options: options}
|
executer := &ClusterExecuter{options: options}
|
||||||
if len(requests[0].RequestsDNS) == 1 {
|
if len(requests[0].RequestsDNS) == 1 {
|
||||||
executer.templateType = types.DNSProtocol
|
executer.templateType = types.DNSProtocol
|
||||||
|
|
|
@ -33,7 +33,7 @@ func init() {
|
||||||
// TODO make sure reading from the disk the template parsing happens once: see parsers.ParseTemplate vs templates.Parse
|
// TODO make sure reading from the disk the template parsing happens once: see parsers.ParseTemplate vs templates.Parse
|
||||||
//
|
//
|
||||||
//nolint:gocritic // this cannot be passed by pointer
|
//nolint:gocritic // this cannot be passed by pointer
|
||||||
func Parse(filePath string, preprocessor Preprocessor, options protocols.ExecuterOptions) (*Template, error) {
|
func Parse(filePath string, preprocessor Preprocessor, options protocols.ExecutorOptions) (*Template, error) {
|
||||||
if !options.DoNotCache {
|
if !options.DoNotCache {
|
||||||
if value, err := parsedTemplatesCache.Has(filePath); value != nil {
|
if value, err := parsedTemplatesCache.Has(filePath); value != nil {
|
||||||
return value.(*Template), err
|
return value.(*Template), err
|
||||||
|
@ -109,7 +109,7 @@ func (template *Template) Requests() int {
|
||||||
}
|
}
|
||||||
|
|
||||||
// compileProtocolRequests compiles all the protocol requests for the template
|
// compileProtocolRequests compiles all the protocol requests for the template
|
||||||
func (template *Template) compileProtocolRequests(options protocols.ExecuterOptions) error {
|
func (template *Template) compileProtocolRequests(options protocols.ExecutorOptions) error {
|
||||||
templateRequests := template.Requests()
|
templateRequests := template.Requests()
|
||||||
|
|
||||||
if templateRequests == 0 {
|
if templateRequests == 0 {
|
||||||
|
@ -172,7 +172,7 @@ func (template *Template) convertRequestToProtocolsRequest(requests interface{})
|
||||||
// compileOfflineHTTPRequest iterates all requests if offline http mode is
|
// compileOfflineHTTPRequest iterates all requests if offline http mode is
|
||||||
// specified and collects all matchers for all the base request templates
|
// specified and collects all matchers for all the base request templates
|
||||||
// (those with URL {{BaseURL}} and it's slash variation.)
|
// (those with URL {{BaseURL}} and it's slash variation.)
|
||||||
func (template *Template) compileOfflineHTTPRequest(options protocols.ExecuterOptions) error {
|
func (template *Template) compileOfflineHTTPRequest(options protocols.ExecutorOptions) error {
|
||||||
operatorsList := []*operators.Operators{}
|
operatorsList := []*operators.Operators{}
|
||||||
|
|
||||||
mainLoop:
|
mainLoop:
|
||||||
|
@ -200,7 +200,7 @@ mainLoop:
|
||||||
|
|
||||||
// ParseTemplateFromReader reads the template from reader
|
// ParseTemplateFromReader reads the template from reader
|
||||||
// returns the parsed template
|
// returns the parsed template
|
||||||
func ParseTemplateFromReader(reader io.Reader, preprocessor Preprocessor, options protocols.ExecuterOptions) (*Template, error) {
|
func ParseTemplateFromReader(reader io.Reader, preprocessor Preprocessor, options protocols.ExecutorOptions) (*Template, error) {
|
||||||
template := &Template{}
|
template := &Template{}
|
||||||
data, err := io.ReadAll(reader)
|
data, err := io.ReadAll(reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -31,14 +31,14 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
var executerOpts protocols.ExecuterOptions
|
var executerOpts protocols.ExecutorOptions
|
||||||
|
|
||||||
func setup() {
|
func setup() {
|
||||||
options := testutils.DefaultOptions
|
options := testutils.DefaultOptions
|
||||||
testutils.Init(options)
|
testutils.Init(options)
|
||||||
progressImpl, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
progressImpl, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
||||||
|
|
||||||
executerOpts = protocols.ExecuterOptions{
|
executerOpts = protocols.ExecutorOptions{
|
||||||
Output: testutils.NewMockOutputWriter(),
|
Output: testutils.NewMockOutputWriter(),
|
||||||
Options: options,
|
Options: options,
|
||||||
Progress: progressImpl,
|
Progress: progressImpl,
|
||||||
|
@ -162,7 +162,7 @@ func Test_ParseWorkflow(t *testing.T) {
|
||||||
},
|
},
|
||||||
Workflow: workflows.Workflow{
|
Workflow: workflows.Workflow{
|
||||||
Workflows: []*workflows.WorkflowTemplate{{Template: "tests/match-1.yaml"}, {Template: "tests/match-1.yaml"}},
|
Workflows: []*workflows.WorkflowTemplate{{Template: "tests/match-1.yaml"}, {Template: "tests/match-1.yaml"}},
|
||||||
Options: &protocols.ExecuterOptions{},
|
Options: &protocols.ExecutorOptions{},
|
||||||
},
|
},
|
||||||
CompiledWorkflow: &workflows.Workflow{},
|
CompiledWorkflow: &workflows.Workflow{},
|
||||||
SelfContained: false,
|
SelfContained: false,
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// compileWorkflow compiles the workflow for execution
|
// compileWorkflow compiles the workflow for execution
|
||||||
func compileWorkflow(path string, preprocessor Preprocessor, options *protocols.ExecuterOptions, workflow *workflows.Workflow, loader model.WorkflowLoader) {
|
func compileWorkflow(path string, preprocessor Preprocessor, options *protocols.ExecutorOptions, workflow *workflows.Workflow, loader model.WorkflowLoader) {
|
||||||
for _, workflow := range workflow.Workflows {
|
for _, workflow := range workflow.Workflows {
|
||||||
if err := parseWorkflow(preprocessor, workflow, options, loader); err != nil {
|
if err := parseWorkflow(preprocessor, workflow, options, loader); err != nil {
|
||||||
gologger.Warning().Msgf("Could not parse workflow %s: %v\n", path, err)
|
gologger.Warning().Msgf("Could not parse workflow %s: %v\n", path, err)
|
||||||
|
@ -20,7 +20,7 @@ func compileWorkflow(path string, preprocessor Preprocessor, options *protocols.
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseWorkflow parses and compiles all templates in a workflow recursively
|
// parseWorkflow parses and compiles all templates in a workflow recursively
|
||||||
func parseWorkflow(preprocessor Preprocessor, workflow *workflows.WorkflowTemplate, options *protocols.ExecuterOptions, loader model.WorkflowLoader) error {
|
func parseWorkflow(preprocessor Preprocessor, workflow *workflows.WorkflowTemplate, options *protocols.ExecutorOptions, loader model.WorkflowLoader) error {
|
||||||
shouldNotValidate := false
|
shouldNotValidate := false
|
||||||
|
|
||||||
if workflow.Template == "" && workflow.Tags.IsEmpty() {
|
if workflow.Template == "" && workflow.Tags.IsEmpty() {
|
||||||
|
@ -55,7 +55,7 @@ func parseWorkflow(preprocessor Preprocessor, workflow *workflows.WorkflowTempla
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseWorkflowTemplate parses a workflow template creating an executer
|
// parseWorkflowTemplate parses a workflow template creating an executer
|
||||||
func parseWorkflowTemplate(workflow *workflows.WorkflowTemplate, preprocessor Preprocessor, options *protocols.ExecuterOptions, loader model.WorkflowLoader, noValidate bool) error {
|
func parseWorkflowTemplate(workflow *workflows.WorkflowTemplate, preprocessor Preprocessor, options *protocols.ExecutorOptions, loader model.WorkflowLoader, noValidate bool) error {
|
||||||
var paths []string
|
var paths []string
|
||||||
|
|
||||||
subTemplateTags := workflow.Tags
|
subTemplateTags := workflow.Tags
|
||||||
|
|
|
@ -76,9 +76,9 @@ type TemplateInfo struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockExecuterOptions creates a new mock executeroptions struct
|
// NewMockExecuterOptions creates a new mock executeroptions struct
|
||||||
func NewMockExecuterOptions(options *types.Options, info *TemplateInfo) *protocols.ExecuterOptions {
|
func NewMockExecuterOptions(options *types.Options, info *TemplateInfo) *protocols.ExecutorOptions {
|
||||||
progressImpl, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
progressImpl, _ := progress.NewStatsTicker(0, false, false, false, false, 0)
|
||||||
executerOpts := &protocols.ExecuterOptions{
|
executerOpts := &protocols.ExecutorOptions{
|
||||||
TemplateID: info.ID,
|
TemplateID: info.ID,
|
||||||
TemplateInfo: info.Info,
|
TemplateInfo: info.Info,
|
||||||
TemplatePath: info.Path,
|
TemplatePath: info.Path,
|
||||||
|
|
|
@ -15,7 +15,7 @@ type Workflow struct {
|
||||||
// Workflows is a list of workflows to execute for a template.
|
// Workflows is a list of workflows to execute for a template.
|
||||||
Workflows []*WorkflowTemplate `yaml:"workflows,omitempty" json:"workflows,omitempty" jsonschema:"title=list of workflows to execute,description=List of workflows to execute for template"`
|
Workflows []*WorkflowTemplate `yaml:"workflows,omitempty" json:"workflows,omitempty" jsonschema:"title=list of workflows to execute,description=List of workflows to execute for template"`
|
||||||
|
|
||||||
Options *protocols.ExecuterOptions `yaml:"-" json:"-"`
|
Options *protocols.ExecutorOptions `yaml:"-" json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// WorkflowTemplate is a template to be run as part of a workflow
|
// WorkflowTemplate is a template to be run as part of a workflow
|
||||||
|
@ -44,7 +44,7 @@ type WorkflowTemplate struct {
|
||||||
// ProtocolExecuterPair is a pair of protocol executer and its options
|
// ProtocolExecuterPair is a pair of protocol executer and its options
|
||||||
type ProtocolExecuterPair struct {
|
type ProtocolExecuterPair struct {
|
||||||
Executer protocols.Executer
|
Executer protocols.Executer
|
||||||
Options *protocols.ExecuterOptions
|
Options *protocols.ExecutorOptions
|
||||||
TemplateType templateTypes.ProtocolType
|
TemplateType templateTypes.ProtocolType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue