diff options
| author | s <[email protected]> | 2025-12-20 02:45:32 -0500 |
|---|---|---|
| committer | s <[email protected]> | 2025-12-20 02:45:32 -0500 |
| commit | bfd971bbc8d35685f18f4b9dd3a52f04f8b4f77f (patch) | |
| tree | 2003679a51efaa7c1a43fe4f6da95530de8ce8aa /internal/formatter | |
| parent | c8ad5b9ef9fdc094c2cd974d6b9a65112089922b (diff) | |
| download | dborg-bfd971bbc8d35685f18f4b9dd3a52f04f8b4f77f.tar.gz dborg-bfd971bbc8d35685f18f4b9dd3a52f04f8b4f77f.zip | |
feat: add moon logs search command and filename filter support for stealer logsv1.0.9
Diffstat (limited to 'internal/formatter')
| -rw-r--r-- | internal/formatter/moon.go | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/internal/formatter/moon.go b/internal/formatter/moon.go new file mode 100644 index 0000000..e3930c7 --- /dev/null +++ b/internal/formatter/moon.go @@ -0,0 +1,85 @@ +package formatter + +import ( + "encoding/json" + "fmt" + "strings" + + "git.db.org.ai/dborg/internal/models" +) + +func FormatMoonResults(resp *models.MoonResponse, asJSON bool) (string, error) { + if asJSON { + data, err := json.MarshalIndent(resp.Results, "", " ") + if err != nil { + return "", fmt.Errorf("failed to marshal JSON: %w", err) + } + return string(data), nil + } + + var sb strings.Builder + + if resp.Results == nil { + sb.WriteString(fmt.Sprintf("\n%s\n\n", Gray("No results found"))) + return sb.String(), nil + } + + resultsMap, ok := resp.Results.(map[string]interface{}) + if !ok { + resultsJSON, err := json.MarshalIndent(resp.Results, "", " ") + if err != nil { + return "", fmt.Errorf("failed to format results: %w", err) + } + return string(resultsJSON), nil + } + + hits, ok := resultsMap["hits"].([]interface{}) + if !ok || len(hits) == 0 { + sb.WriteString(fmt.Sprintf("\n%s\n\n", Gray("No results found"))) + return sb.String(), nil + } + + numHits, _ := resultsMap["num_hits"].(float64) + elapsed, _ := resultsMap["elapsed_time_micros"].(float64) + + sb.WriteString(fmt.Sprintf("%s %s %s\n", + Cyan("Found"), + Bold(Yellow(fmt.Sprintf("%d", int(numHits)))), + Cyan(fmt.Sprintf("moon log entries (%.2fms)", elapsed/1000)))) + sb.WriteString("\n") + + for i, hit := range hits { + hitMap, ok := hit.(map[string]interface{}) + if !ok { + continue + } + + if i > 0 { + sb.WriteString(Dim("───")) + sb.WriteString("\n") + } + + username, _ := hitMap["username"].(string) + password, _ := hitMap["password"].(string) + url, _ := hitMap["url"].(string) + filename, _ := hitMap["filename"].(string) + + sb.WriteString(fmt.Sprintf("%s %s\n", Dim("Username:"), Bold(username))) + + if password != "" { + sb.WriteString(fmt.Sprintf("%s %s\n", Dim("Password:"), Yellow(password))) + } + + if url != "" { + sb.WriteString(fmt.Sprintf("%s %s\n", Dim("URL:"), Blue(url))) + } + + if filename != "" { + sb.WriteString(fmt.Sprintf("%s %s\n", Dim("Source:"), Magenta(filename))) + } + + sb.WriteString("\n") + } + + return sb.String(), nil +} |
