From a32d4bbadf3991ba339a2fbac0834dc672edeba0 Mon Sep 17 00:00:00 2001 From: Luke Tainton Date: Sat, 21 Nov 2020 21:15:48 +0000 Subject: [PATCH] Minimum viable --- API.go | 26 ++++++++++++++++++++++++++ Header.go | 14 ++++++++++++++ IPInfo.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ Main.go | 30 ++++++++++++++---------------- 4 files changed, 105 insertions(+), 16 deletions(-) create mode 100644 API.go create mode 100644 Header.go create mode 100644 IPInfo.go diff --git a/API.go b/API.go new file mode 100644 index 0000000..171eb54 --- /dev/null +++ b/API.go @@ -0,0 +1,26 @@ +package main + +import ( + "io/ioutil" + "net" + "net/http" +) + +func getLocalIP() string { + resp, _ := http.Get("https://api.ipify.org") + body, _ := ioutil.ReadAll(resp.Body) + return string(body[:]) +} + +func checkIPSyntax(ipaddress string) bool { + addr := net.ParseIP(ipaddress) + if addr == nil { + return false + } + return true +} + +func resolveDNSHostname(hostname string) string { + address, _ := net.LookupHost(hostname) + return address[0] +} diff --git a/Header.go b/Header.go new file mode 100644 index 0000000..15cf99b --- /dev/null +++ b/Header.go @@ -0,0 +1,14 @@ +package main + +import "fmt" + +func printHeader() { + fmt.Println("------------------------------") + fmt.Println("| IP Address Information |") + fmt.Println("| Lookup Tool |") + fmt.Println("| (iPilot) |") + fmt.Println("| |") + fmt.Println("| By Luke Tainton |") + fmt.Println("| @luketainton |") + fmt.Println("------------------------------") +} diff --git a/IPInfo.go b/IPInfo.go new file mode 100644 index 0000000..e037f4f --- /dev/null +++ b/IPInfo.go @@ -0,0 +1,51 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "strings" +) + +// IPAddressInfo is the IP Address information from API +type IPAddressInfo struct { + Status string `json:"status"` + Country string `json:"country"` + CountryCode string `json:"countryCode"` + Region string `json:"region"` + RegionName string `json:"regionName"` + City string `json:"city"` + ZIP string `json:"zip"` + Latitude float32 `json:"lat"` + Longitude float32 `json:"lon"` + Timezone string `json:"timezone"` + ISP string `json:"isp"` + Organisation string `json:"org"` + AS string `json:"as"` + IPAddress string `json:"query"` +} + +func getIPInfo(ipaddress string) IPAddressInfo { + apiEndpoint := "http://ip-api.com/json/" + ipaddress + resp, _ := http.Get(apiEndpoint) + body, _ := ioutil.ReadAll(resp.Body) + // fmt.Print(string(body)) + infoString := string(body) + var info IPAddressInfo + err := json.Unmarshal([]byte(infoString), &info) + if err != nil { + fmt.Println(err) + } + return info +} + +func printIPInfo(input string) { + var IPInfo IPAddressInfo = getIPInfo(input) + var location string = IPInfo.Country + "/" + IPInfo.RegionName + "/" + IPInfo.City + fmt.Println("IP Address: ", IPInfo.IPAddress) + fmt.Println("Location: ", location) + fmt.Println("Timezone: ", IPInfo.Timezone) + fmt.Println("ISP: ", IPInfo.ISP) + fmt.Println("BGP AS: ", strings.Fields(IPInfo.AS)[0]) +} diff --git a/Main.go b/Main.go index 29c3fc7..0b1aed4 100644 --- a/Main.go +++ b/Main.go @@ -3,25 +3,23 @@ package main import ( "flag" "fmt" - "io/ioutil" - "net/http" ) -func getLocalIP() string { - resp, _ := http.Get("https://api.ipify.org") - // defer resp.Body.Close() - body, _ := ioutil.ReadAll(resp.Body) - return string(body[:]) -} - func main() { - var ipaddress string + printHeader() + + var input string localIPAddress := getLocalIP() - flag.StringVar(&ipaddress, "i", localIPAddress, "Specify IP address. Defaults to current public IP address.") + flag.StringVar(&input, "i", localIPAddress, "Specify IP address or domain name.") flag.Parse() - apiEndpoint := "http://ip-api.com/json/" + ipaddress - resp, _ := http.Get(apiEndpoint) - // defer resp.Body.Close() - body, _ := ioutil.ReadAll(resp.Body) - fmt.Print(string(body)) + var isIPCorrect bool = checkIPSyntax(input) + if isIPCorrect == true { + printIPInfo(input) + } else { + // fmt.Println(ipaddress, "is not a valid IP address.") + fmt.Println("Domain Name: ", input) + ipaddress := resolveDNSHostname(input) + printIPInfo(ipaddress) + } + }