summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--whois.go66
1 files changed, 56 insertions, 10 deletions
diff --git a/whois.go b/whois.go
index 8fb7be3..d8190ca 100644
--- a/whois.go
+++ b/whois.go
@@ -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"))
}