github.com/crowdsecurity/crowdsec@v1.6.1/pkg/database/utils.go (about) 1 package database 2 3 import ( 4 "encoding/binary" 5 "fmt" 6 "net" 7 "strconv" 8 "strings" 9 "time" 10 ) 11 12 func IP2Int(ip net.IP) uint32 { 13 if len(ip) == 16 { 14 return binary.BigEndian.Uint32(ip[12:16]) 15 } 16 return binary.BigEndian.Uint32(ip) 17 } 18 19 func Int2ip(nn uint32) net.IP { 20 ip := make(net.IP, 4) 21 binary.BigEndian.PutUint32(ip, nn) 22 return ip 23 } 24 25 func IsIpv4(host string) bool { 26 return net.ParseIP(host) != nil 27 } 28 29 //Stolen from : https://github.com/llimllib/ipaddress/ 30 // Return the final address of a net range. Convert to IPv4 if possible, 31 // otherwise return an ipv6 32 func LastAddress(n *net.IPNet) net.IP { 33 ip := n.IP.To4() 34 if ip == nil { 35 ip = n.IP 36 return net.IP{ 37 ip[0] | ^n.Mask[0], ip[1] | ^n.Mask[1], ip[2] | ^n.Mask[2], 38 ip[3] | ^n.Mask[3], ip[4] | ^n.Mask[4], ip[5] | ^n.Mask[5], 39 ip[6] | ^n.Mask[6], ip[7] | ^n.Mask[7], ip[8] | ^n.Mask[8], 40 ip[9] | ^n.Mask[9], ip[10] | ^n.Mask[10], ip[11] | ^n.Mask[11], 41 ip[12] | ^n.Mask[12], ip[13] | ^n.Mask[13], ip[14] | ^n.Mask[14], 42 ip[15] | ^n.Mask[15]} 43 } 44 45 return net.IPv4( 46 ip[0]|^n.Mask[0], 47 ip[1]|^n.Mask[1], 48 ip[2]|^n.Mask[2], 49 ip[3]|^n.Mask[3]) 50 } 51 52 func GetIpsFromIpRange(host string) (int64, int64, error) { 53 var ipStart int64 54 var ipEnd int64 55 var err error 56 var parsedRange *net.IPNet 57 58 if _, parsedRange, err = net.ParseCIDR(host); err != nil { 59 return ipStart, ipEnd, fmt.Errorf("'%s' is not a valid CIDR", host) 60 } 61 if parsedRange == nil { 62 return ipStart, ipEnd, fmt.Errorf("unable to parse network : %s", err) 63 } 64 ipStart = int64(IP2Int(parsedRange.IP)) 65 ipEnd = int64(IP2Int(LastAddress(parsedRange))) 66 67 return ipStart, ipEnd, nil 68 } 69 70 func ParseDuration(d string) (time.Duration, error) { 71 durationStr := d 72 if strings.HasSuffix(d, "d") { 73 days := strings.Split(d, "d")[0] 74 if len(days) == 0 { 75 return 0, fmt.Errorf("'%s' can't be parsed as duration", d) 76 } 77 daysInt, err := strconv.Atoi(days) 78 if err != nil { 79 return 0, err 80 } 81 durationStr = strconv.Itoa(daysInt*24) + "h" 82 } 83 duration, err := time.ParseDuration(durationStr) 84 if err != nil { 85 return 0, err 86 } 87 return duration, nil 88 }