|
@@ -1,6 +1,7 @@
|
|
|
package netutils
|
|
|
|
|
|
import (
|
|
|
+ "net"
|
|
|
"strings"
|
|
|
"time"
|
|
|
)
|
|
@@ -83,3 +84,116 @@ func ParseWHOISResponse(response string) (WHOISResult, error) {
|
|
|
|
|
|
return result, nil
|
|
|
}
|
|
|
+
|
|
|
+type WhoisIpLookupEntry struct {
|
|
|
+ NetRange string
|
|
|
+ CIDR string
|
|
|
+ NetName string
|
|
|
+ NetHandle string
|
|
|
+ Parent string
|
|
|
+ NetType string
|
|
|
+ OriginAS string
|
|
|
+ Organization Organization
|
|
|
+ RegDate time.Time
|
|
|
+ Updated time.Time
|
|
|
+ Ref string
|
|
|
+}
|
|
|
+
|
|
|
+type Organization struct {
|
|
|
+ OrgName string
|
|
|
+ OrgId string
|
|
|
+ Address string
|
|
|
+ City string
|
|
|
+ StateProv string
|
|
|
+ PostalCode string
|
|
|
+ Country string
|
|
|
+ /*
|
|
|
+ RegDate time.Time
|
|
|
+ Updated time.Time
|
|
|
+ OrgTechHandle string
|
|
|
+ OrgTechName string
|
|
|
+ OrgTechPhone string
|
|
|
+ OrgTechEmail string
|
|
|
+ OrgAbuseHandle string
|
|
|
+ OrgAbuseName string
|
|
|
+ OrgAbusePhone string
|
|
|
+ OrgAbuseEmail string
|
|
|
+ OrgRoutingHandle string
|
|
|
+ OrgRoutingName string
|
|
|
+ OrgRoutingPhone string
|
|
|
+ OrgRoutingEmail string
|
|
|
+ */
|
|
|
+}
|
|
|
+
|
|
|
+func ParseWhoisIpData(data string) (WhoisIpLookupEntry, error) {
|
|
|
+ var entry WhoisIpLookupEntry = WhoisIpLookupEntry{}
|
|
|
+ var org Organization = Organization{}
|
|
|
+
|
|
|
+ lines := strings.Split(data, "\n")
|
|
|
+
|
|
|
+ for _, line := range lines {
|
|
|
+ line = strings.TrimSpace(line)
|
|
|
+ if strings.HasPrefix(line, "NetRange:") {
|
|
|
+ entry.NetRange = strings.TrimSpace(strings.TrimPrefix(line, "NetRange:"))
|
|
|
+ } else if strings.HasPrefix(line, "CIDR:") {
|
|
|
+ entry.CIDR = strings.TrimSpace(strings.TrimPrefix(line, "CIDR:"))
|
|
|
+ } else if strings.HasPrefix(line, "NetName:") {
|
|
|
+ entry.NetName = strings.TrimSpace(strings.TrimPrefix(line, "NetName:"))
|
|
|
+ } else if strings.HasPrefix(line, "NetHandle:") {
|
|
|
+ entry.NetHandle = strings.TrimSpace(strings.TrimPrefix(line, "NetHandle:"))
|
|
|
+ } else if strings.HasPrefix(line, "Parent:") {
|
|
|
+ entry.Parent = strings.TrimSpace(strings.TrimPrefix(line, "Parent:"))
|
|
|
+ } else if strings.HasPrefix(line, "NetType:") {
|
|
|
+ entry.NetType = strings.TrimSpace(strings.TrimPrefix(line, "NetType:"))
|
|
|
+ } else if strings.HasPrefix(line, "OriginAS:") {
|
|
|
+ entry.OriginAS = strings.TrimSpace(strings.TrimPrefix(line, "OriginAS:"))
|
|
|
+ } else if strings.HasPrefix(line, "Organization:") {
|
|
|
+ org.OrgName = strings.TrimSpace(strings.TrimPrefix(line, "Organization:"))
|
|
|
+ } else if strings.HasPrefix(line, "OrgId:") {
|
|
|
+ org.OrgId = strings.TrimSpace(strings.TrimPrefix(line, "OrgId:"))
|
|
|
+ } else if strings.HasPrefix(line, "Address:") {
|
|
|
+ org.Address = strings.TrimSpace(strings.TrimPrefix(line, "Address:"))
|
|
|
+ } else if strings.HasPrefix(line, "City:") {
|
|
|
+ org.City = strings.TrimSpace(strings.TrimPrefix(line, "City:"))
|
|
|
+ } else if strings.HasPrefix(line, "StateProv:") {
|
|
|
+ org.StateProv = strings.TrimSpace(strings.TrimPrefix(line, "StateProv:"))
|
|
|
+ } else if strings.HasPrefix(line, "PostalCode:") {
|
|
|
+ org.PostalCode = strings.TrimSpace(strings.TrimPrefix(line, "PostalCode:"))
|
|
|
+ } else if strings.HasPrefix(line, "Country:") {
|
|
|
+ org.Country = strings.TrimSpace(strings.TrimPrefix(line, "Country:"))
|
|
|
+ } else if strings.HasPrefix(line, "RegDate:") {
|
|
|
+ entry.RegDate, _ = parseDate(strings.TrimSpace(strings.TrimPrefix(line, "RegDate:")))
|
|
|
+ } else if strings.HasPrefix(line, "Updated:") {
|
|
|
+ entry.Updated, _ = parseDate(strings.TrimSpace(strings.TrimPrefix(line, "Updated:")))
|
|
|
+ } else if strings.HasPrefix(line, "Ref:") {
|
|
|
+ entry.Ref = strings.TrimSpace(strings.TrimPrefix(line, "Ref:"))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ entry.Organization = org
|
|
|
+ return entry, nil
|
|
|
+}
|
|
|
+
|
|
|
+func parseDate(dateStr string) (time.Time, error) {
|
|
|
+ dateLayout := "2006-01-02"
|
|
|
+ date, err := time.Parse(dateLayout, strings.TrimSpace(dateStr))
|
|
|
+ if err != nil {
|
|
|
+ return time.Time{}, err
|
|
|
+ }
|
|
|
+ return date, nil
|
|
|
+}
|
|
|
+
|
|
|
+func isDomainName(input string) bool {
|
|
|
+ ip := net.ParseIP(input)
|
|
|
+ if ip != nil {
|
|
|
+ // Check if it's IPv4 or IPv6
|
|
|
+ if ip.To4() != nil {
|
|
|
+ return false
|
|
|
+ } else if ip.To16() != nil {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err := net.LookupHost(input)
|
|
|
+ return err == nil
|
|
|
+}
|