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  }