Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/scan/charts/charts.go
2070 views
1
package charts
2
3
import (
4
"fmt"
5
"os"
6
"path/filepath"
7
8
"github.com/labstack/echo/v4"
9
"github.com/projectdiscovery/nuclei/v3/pkg/scan/events"
10
"github.com/projectdiscovery/nuclei/v3/pkg/utils/json"
11
fileutil "github.com/projectdiscovery/utils/file"
12
)
13
14
// ScanEventsCharts is a struct for nuclei event charts
15
type ScanEventsCharts struct {
16
eventsDir string
17
config *events.ScanConfig
18
data []events.ScanEvent
19
}
20
21
func (sc *ScanEventsCharts) PrintInfo() {
22
fmt.Printf("[+] Scan Info\n")
23
fmt.Printf(" - Name: %s\n", sc.config.Name)
24
fmt.Printf(" - Target Count: %d\n", sc.config.TargetCount)
25
fmt.Printf(" - Template Count: %d\n", sc.config.TemplatesCount)
26
fmt.Printf(" - Template Concurrency: %d\n", sc.config.TemplateConcurrency)
27
fmt.Printf(" - Payload Concurrency: %d\n", sc.config.PayloadConcurrency)
28
fmt.Printf(" - Retries: %v\n", sc.config.Retries)
29
fmt.Printf(" - Total Events: %d\n", len(sc.data))
30
fmt.Println()
31
}
32
33
// NewScanEventsCharts creates a new nuclei event charts
34
func NewScanEventsCharts(eventsDir string) (*ScanEventsCharts, error) {
35
sc := &ScanEventsCharts{eventsDir: eventsDir}
36
if !fileutil.FolderExists(eventsDir) {
37
return nil, fmt.Errorf("events directory does not exist")
38
}
39
// open two files
40
// config.json
41
bin, err := os.ReadFile(filepath.Join(eventsDir, events.ConfigFile))
42
if err != nil {
43
return nil, err
44
}
45
var config events.ScanConfig
46
err = json.Unmarshal(bin, &config)
47
if err != nil {
48
return nil, err
49
}
50
sc.config = &config
51
52
// events.jsonl
53
f, err := os.Open(filepath.Join(eventsDir, events.EventsFile))
54
if err != nil {
55
return nil, err
56
}
57
defer func() {
58
_ = f.Close()
59
}()
60
61
data := []events.ScanEvent{}
62
dec := json.NewDecoder(f)
63
for {
64
var event events.ScanEvent
65
if err := dec.Decode(&event); err != nil {
66
break
67
}
68
data = append(data, event)
69
}
70
sc.data = data
71
72
if len(data) == 0 {
73
return nil, fmt.Errorf("no events found in the events file")
74
}
75
76
return sc, nil
77
}
78
79
// Start starts the nuclei event charts server
80
func (sc *ScanEventsCharts) Start(addr string) {
81
e := echo.New()
82
e.HideBanner = true
83
e.GET("/concurrency", sc.ConcurrencyVsTime)
84
e.GET("/fuzz", sc.TotalRequestsOverTime)
85
e.GET("/slow", sc.TopSlowTemplates)
86
e.GET("/rps", sc.RequestsVSInterval)
87
e.GET("/", sc.AllCharts)
88
e.Logger.Fatal(e.Start(addr))
89
}
90
91