package shodan import ( "context" "fmt" "strings" "github.com/ns3777k/go-shodan/v4/shodan" "git.tcp.direct/perp/shogo/internal/utils" ) // Return host information func Host(ip string) { // Get results results, err := utils.Client.GetServicesForHost( context.Background(), ip, &shodan.HostServicesOptions{}, ) if err != nil { fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) return } // Print results utils.Title.Printf("Host: %s\n", ip) fmt.Printf( "%s: %s\n", utils.Green("Hostnames"), utils.Blue(strings.Join(results.Hostnames, ",")), ) fmt.Printf("%s: %s\n", utils.Blue("Organization"), utils.Green(results.Organization)) fmt.Printf("%s: %s\n", utils.Green("Country"), utils.Blue(results.Country)) fmt.Printf("%s: %s\n", utils.Blue("City"), utils.Green(results.City)) fmt.Printf("%s: %s\n", utils.Green("Updated"), utils.Blue(results.LastUpdate)) fmt.Printf("%s: %s\n", utils.Blue("Port count"), utils.Green(len(results.Ports))) fmt.Printf("\n%s:\n", utils.Green("Ports")) // Color alternator & current line var alternate bool var line string for index := range results.Data { // Alternate between colors // Find each port & transport if alternate { alternate = false line = fmt.Sprintf( "\t%s/%s", utils.Blue(results.Data[index].Port), utils.Green(results.Data[index].Transport), ) } else if !alternate { alternate = true line = fmt.Sprintf( "\t%s/%s", utils.Green(results.Data[index].Port), utils.Blue(results.Data[index].Transport), ) } // Find each product if results.Data[index].Product != "" { if alternate { line = fmt.Sprintf("%s (%s)", line, utils.Green(results.Data[index].Product)) } else if !alternate { line = fmt.Sprintf("%s (%s)", line, utils.Blue(results.Data[index].Product)) } } // Print results fmt.Println(line) } }