70 lines
1.4 KiB
Go
70 lines
1.4 KiB
Go
package shodan
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/ns3777k/go-shodan/v4/shodan"
|
|
|
|
"git.supernets.org/perp/shogo/internal/utils"
|
|
)
|
|
|
|
// Stats query
|
|
type Stats struct {
|
|
Query string // Search query
|
|
Page int // Current page
|
|
Results chan string // Results channel
|
|
}
|
|
|
|
// Return facet stats on a search
|
|
func (s *Shodan) Stats() {
|
|
// Setup options
|
|
options := &shodan.HostQueryOptions{
|
|
Query: s.Flags.Query,
|
|
Facets: s.Flags.Facets,
|
|
Page: 1,
|
|
}
|
|
|
|
// Get results
|
|
results, err := utils.Client.GetHostsForQuery(context.Background(), options)
|
|
if err != nil {
|
|
s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
|
|
return
|
|
}
|
|
|
|
// Store lines
|
|
var lines string
|
|
|
|
// Split facets
|
|
splitted := strings.Split(s.Flags.Facets, ",")
|
|
|
|
// Go through splitted
|
|
for split := range splitted {
|
|
// Get facet & count
|
|
facet := strings.Split(splitted[split], ":")
|
|
|
|
// Add lines
|
|
lines += utils.Title.Sprintf(
|
|
"\nTop %s results for %s query with %s facet\n",
|
|
facet[1],
|
|
s.Flags.Query,
|
|
facet[0],
|
|
)
|
|
|
|
for index := range results.Facets[facet[0]] {
|
|
lines += fmt.Sprintf(
|
|
"%s: %s\n",
|
|
utils.Green(results.Facets[facet[0]][index].Value),
|
|
utils.Blue(results.Facets[facet[0]][index].Count),
|
|
)
|
|
}
|
|
}
|
|
|
|
// Remove empty newline(s)
|
|
// Send results
|
|
lines = strings.Replace(lines, "\n", "", 1)
|
|
lines = strings.TrimRight(lines, "\n")
|
|
s.Results <- lines
|
|
}
|