utils.go 1.5 KB

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