82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
package utils
|
|
|
|
import (
|
|
"net"
|
|
"fmt"
|
|
|
|
"github.com/oschwald/geoip2-golang"
|
|
)
|
|
|
|
func HandleGeoIPCommand(ipAddress string, dbCity string, dbASN string) (string, error) {
|
|
ip := net.ParseIP(ipAddress)
|
|
|
|
// Check if IP/Hostname is valid
|
|
if ip == nil {
|
|
resolvedIP, err := net.LookupIP(ipAddress)
|
|
if err != nil || len(resolvedIP) == 0 {
|
|
return "", fmt.Errorf("Invalid IP or hostname: %s", ipAddress)
|
|
}
|
|
ip = resolvedIP[0]
|
|
}
|
|
|
|
var (
|
|
city = "N/A"
|
|
state = "N/A"
|
|
country = "N/A"
|
|
asn = "N/A"
|
|
isp = "N/A"
|
|
)
|
|
|
|
// Lookup City, State and Country info
|
|
if cityDb, err := geoip2.Open(dbCity); err == nil {
|
|
defer cityDb.Close()
|
|
|
|
if cityRecord, err := cityDb.City(ip); err == nil {
|
|
if name := cityRecord.City.Names["en"]; name != "" {
|
|
city = name
|
|
}
|
|
|
|
if len(cityRecord.Subdivisions) > 0 {
|
|
if name := cityRecord.Subdivisions[0].Names["en"]; name != "" {
|
|
state = name
|
|
}
|
|
}
|
|
|
|
if name := cityRecord.Country.Names["en"]; name != "" {
|
|
country = name
|
|
}
|
|
} else {
|
|
return "", fmt.Errorf("City Lookup error: %v", err)
|
|
}
|
|
} else {
|
|
return "", fmt.Errorf("Error opening City database: %v", err)
|
|
}
|
|
|
|
// Lookup ASN info
|
|
if asnDb, err := geoip2.Open(dbASN); err == nil {
|
|
defer asnDb.Close()
|
|
|
|
if asnRecord, err := asnDb.ASN(ip); err == nil {
|
|
if asnNum := asnRecord.AutonomousSystemNumber; asnNum != 0 {
|
|
asn = fmt.Sprintf("%d", asnNum)
|
|
}
|
|
|
|
if org := asnRecord.AutonomousSystemOrganization; org != "" {
|
|
isp = org
|
|
}
|
|
} else {
|
|
return "", fmt.Errorf("ASN lookup error: %v", err)
|
|
}
|
|
} else {
|
|
return "", fmt.Errorf("Error opening ASN database: %v", err)
|
|
}
|
|
|
|
// Format the response
|
|
response := fmt.Sprintf(
|
|
"IP: %s | Location: %s, %s, %s | ASN: %s | ISP: %s",
|
|
ip.String(), city, state, country, asn, isp,
|
|
)
|
|
|
|
return response, nil
|
|
}
|