bitbucket.org/Aishee/synsec@v0.0.0-20210414005726-236fc01a153d/pkg/database/utils.go (about) 1 package database 2 3 import ( 4 "encoding/binary" 5 "fmt" 6 "net" 7 ) 8 9 func IP2Int(ip net.IP) uint32 { 10 if len(ip) == 16 { 11 return binary.BigEndian.Uint32(ip[12:16]) 12 } 13 return binary.BigEndian.Uint32(ip) 14 } 15 16 func Int2ip(nn uint32) net.IP { 17 ip := make(net.IP, 4) 18 binary.BigEndian.PutUint32(ip, nn) 19 return ip 20 } 21 22 func IsIpv4(host string) bool { 23 return net.ParseIP(host) != nil 24 } 25 26 //Stolen from : https://github.com/llimllib/ipaddress/ 27 // Return the final address of a net range. Convert to IPv4 if possible, 28 // otherwise return an ipv6 29 func LastAddress(n *net.IPNet) net.IP { 30 ip := n.IP.To4() 31 if ip == nil { 32 ip = n.IP 33 return net.IP{ 34 ip[0] | ^n.Mask[0], ip[1] | ^n.Mask[1], ip[2] | ^n.Mask[2], 35 ip[3] | ^n.Mask[3], ip[4] | ^n.Mask[4], ip[5] | ^n.Mask[5], 36 ip[6] | ^n.Mask[6], ip[7] | ^n.Mask[7], ip[8] | ^n.Mask[8], 37 ip[9] | ^n.Mask[9], ip[10] | ^n.Mask[10], ip[11] | ^n.Mask[11], 38 ip[12] | ^n.Mask[12], ip[13] | ^n.Mask[13], ip[14] | ^n.Mask[14], 39 ip[15] | ^n.Mask[15]} 40 } 41 42 return net.IPv4( 43 ip[0]|^n.Mask[0], 44 ip[1]|^n.Mask[1], 45 ip[2]|^n.Mask[2], 46 ip[3]|^n.Mask[3]) 47 } 48 49 func GetIpsFromIpRange(host string) (int64, int64, error) { 50 var ipStart int64 51 var ipEnd int64 52 var err error 53 var parsedRange *net.IPNet 54 55 if _, parsedRange, err = net.ParseCIDR(host); err != nil { 56 return ipStart, ipEnd, fmt.Errorf("'%s' is not a valid CIDR", host) 57 } 58 if parsedRange == nil { 59 return ipStart, ipEnd, fmt.Errorf("unable to parse network : %s", err) 60 } 61 ipStart = int64(IP2Int(parsedRange.IP)) 62 ipEnd = int64(IP2Int(LastAddress(parsedRange))) 63 64 return ipStart, ipEnd, nil 65 }