package shodan import ( "context" "fmt" "strings" "github.com/ns3777k/go-shodan/v4/shodan" "git.tcp.direct/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 }