diff options
| author | Daniel Langesten <daniel.langest@gmail.com> | 2015-02-25 14:52:48 +0100 |
|---|---|---|
| committer | Daniel Langesten <daniel.langest@gmail.com> | 2015-02-25 14:52:48 +0100 |
| commit | 9b919ede5ea1e02cc4b2815761cb17e3f897dcef (patch) | |
| tree | a94d3630e7d4c8dd1eb50c1fcf9e4ae48b0715ce | |
| parent | df6005df35ad6b8f6265297d10247f458ede05bc (diff) | |
can now query bulks or singles
| -rw-r--r-- | whois.go | 66 |
1 files changed, 56 insertions, 10 deletions
@@ -9,7 +9,7 @@ import ( ) const ( - WHOIS_SERVER = /*"whois-servers.net"*/ "whois.cymru.com" + WHOIS_SERVER = /*"whois-servers.net"*/ "whois.cymru.com" /*"asn.shadowserver.org"*/ WHOIS_PORT = "43" TIMEOUT = 30 RETRIES = 1 @@ -21,31 +21,77 @@ type asnipPair struct { } func main() { - domains := []string{"109.105.104.100", "123.123.123.123"} - res, err := whois(domains, WHOIS_SERVER) + pairs, err := findASAndIPBlock("109.105.104.100", "123.123.123.123") if err != nil { + panic(err) + } + fmt.Println(pairs) + pairs, err = findASAndIPBlock("123.123.123.123") + if err != nil { + panic(err) + } + fmt.Println(pairs) +} + +func findASAndIPBlock(domains ...string) (pairs []asnipPair, err error) { + if len(domains) == 0 { return } + var res string + if len(domains) == 1 { + res, err = whois(domains[0]) + if err != nil { + return + } + } else { + res, err = whoisBulk(domains) + if err != nil { + return + } + } + lines := strings.Split(res, "\n") - asip := make([]asnipPair, 0, len(lines)-2) + pairs = make([]asnipPair, 0, len(lines)-2) for _, line := range lines[1 : len(lines)-1] { content := strings.Split(line, "|") as := strings.TrimSpace(content[0]) ip := strings.TrimSpace(content[2]) - asip = append(asip, asnipPair{ + pairs = append(pairs, asnipPair{ asNum: as, ipAdr: ip, }) } - fmt.Println("cap:", cap(asip), ", len:", len(asip), ", content:", asip) + return +} + +func whois(domain string) (answer string, err error) { + var conn net.Conn + for i := 0; i < RETRIES; i++ { + conn, err = net.DialTimeout("tcp", net.JoinHostPort("whois.cymru.com", WHOIS_PORT), time.Second*TIMEOUT) + if err != nil { + return + } + } + defer conn.Close() + + //conn.Write([]byte(" -p " + domain + "\r\n")) + conn.Write([]byte(" -p -o -u " + domain + "\r\n")) + + buff, err := ioutil.ReadAll(conn) + if err != nil { + return + } + + answer = string(buff[:]) + return + } -/* implements the whois protocal described at https://en.wikipedia.org/wiki/Whois#Protocol */ -func whois(domains []string, server string) (answer string, err error) { +func whoisBulk(domains []string) (answer string, err error) { var conn net.Conn for i := 0; i < RETRIES; i++ { - conn, err = net.DialTimeout("tcp", net.JoinHostPort(server, WHOIS_PORT), time.Second*TIMEOUT) + conn, err = net.DialTimeout("tcp", net.JoinHostPort("whois.cymru.com", WHOIS_PORT), time.Second*TIMEOUT) if err != nil { return } @@ -53,7 +99,7 @@ func whois(domains []string, server string) (answer string, err error) { defer conn.Close() //conn.Write([]byte(" -p " + domain + "\r\n")) - conn.Write([]byte(" -p -o -f -u begin\r\n")) + conn.Write([]byte(" -p -o -u begin\r\n")) for _, d := range domains { conn.Write([]byte(d + "\r\n")) } |
