spray/internal/format.go

89 lines
2.0 KiB
Go
Raw Normal View History

package internal
import (
"bytes"
"encoding/json"
"github.com/chainreactors/logs"
2024-02-10 18:23:50 +08:00
"github.com/chainreactors/spray/pkg"
2024-08-26 01:47:39 +08:00
"github.com/chainreactors/words/mask"
2024-07-17 01:40:30 +08:00
"io"
2024-08-26 00:04:44 +08:00
"net/url"
"os"
2024-08-26 01:47:39 +08:00
"strings"
)
2024-08-26 00:04:44 +08:00
func Format(opts Option) {
var content []byte
var err error
2024-08-26 00:04:44 +08:00
if opts.Format == "stdin" {
2024-07-17 01:40:30 +08:00
content, err = io.ReadAll(os.Stdin)
} else {
2024-08-26 00:04:44 +08:00
content, err = os.ReadFile(opts.Format)
}
if err != nil {
return
}
2024-08-26 00:04:44 +08:00
group := make(map[string][]*pkg.Baseline)
for _, line := range bytes.Split(bytes.TrimSpace(content), []byte("\n")) {
2024-02-10 18:23:50 +08:00
var result pkg.Baseline
err := json.Unmarshal(line, &result)
if err != nil {
logs.Log.Error(err.Error())
return
}
2024-08-26 00:04:44 +08:00
result.Url, err = url.Parse(result.UrlString)
if err != nil {
continue
}
group[result.Url.Host] = append(group[result.Url.Host], &result)
}
2024-08-26 00:04:44 +08:00
for _, results := range group {
for _, result := range results {
if !opts.Fuzzy && result.IsFuzzy {
continue
}
2024-10-14 02:20:39 +08:00
if opts.OutputProbe == "" {
if !opts.NoColor {
logs.Log.Console(result.ColorString() + "\n")
} else {
logs.Log.Console(result.String() + "\n")
}
2024-08-26 00:04:44 +08:00
} else {
2024-10-14 02:20:39 +08:00
probes := strings.Split(opts.OutputProbe, ",")
logs.Log.Console(result.ProbeOutput(probes) + "\n")
2024-08-26 00:04:44 +08:00
}
}
}
}
2024-08-26 01:47:39 +08:00
func PrintPreset() {
logs.Log.Console("internal rules:\n")
for name, rule := range pkg.Rules {
logs.Log.Consolef("\t%s\t%d rules\n", name, len(strings.Split(rule, "\n")))
}
logs.Log.Console("\ninternal dicts:\n")
for name, dict := range pkg.Dicts {
logs.Log.Consolef("\t%s\t%d items\n", name, len(dict))
}
logs.Log.Console("\ninternal words keyword:\n")
for name, words := range mask.SpecialWords {
logs.Log.Consolef("\t%s\t%d words\n", name, len(words))
}
logs.Log.Console("\ninternal extractor:\n")
for name, _ := range pkg.ExtractRegexps {
logs.Log.Consolef("\t%s\n", name)
}
logs.Log.Console("\ninternal fingers:\n")
for name, engine := range pkg.FingerEngine.EnginesImpl {
logs.Log.Consolef("\t%s\t%d fingerprints \n", name, engine.Len())
}
logs.Log.Consolef("\nload %d active path\n", len(pkg.ActivePath))
}