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  }