ip.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package host
  2. import (
  3. "net"
  4. //"os" Was used for lookup IP on hostname
  5. "git.giaever.org/joachimmg/go-log.git/log"
  6. "git.giaever.org/joachimmg/m-dns/errors"
  7. )
  8. type IPvType uint
  9. const (
  10. NoIP IPvType = 0x1
  11. SysIP IPvType = 0x2
  12. IPv4 IPvType = 0x4
  13. IPv6 IPvType = 0x8
  14. )
  15. type HostIP interface {
  16. String() string
  17. Type() (net.IP, IPvType)
  18. AsIP() net.IP
  19. }
  20. type IP net.IP
  21. func (i IP) String() string {
  22. return i.AsIP().String()
  23. }
  24. func (i IP) AsIP() net.IP {
  25. return net.IP(i)
  26. }
  27. func (i IP) Type() (net.IP, IPvType) {
  28. if ip := i.AsIP().To4(); ip != nil {
  29. switch ip.String() {
  30. case "127.0.0.1",
  31. net.IPv4zero.String(),
  32. net.IPv4bcast.String(),
  33. net.IPv4allsys.String(),
  34. net.IPv4allrouter.String():
  35. return ip, SysIP | IPv4
  36. default:
  37. return ip, IPv4
  38. }
  39. }
  40. if ip := i.AsIP().To16(); ip != nil {
  41. switch ip.String() {
  42. case net.IPv6zero.String(),
  43. net.IPv6loopback.String(),
  44. net.IPv6unspecified.String(),
  45. net.IPv6linklocalallnodes.String(),
  46. net.IPv6linklocalallrouters.String(),
  47. net.IPv6interfacelocalallnodes.String():
  48. return ip, SysIP | IPv6
  49. default:
  50. return ip, IPv6
  51. }
  52. }
  53. return nil, NoIP
  54. }
  55. func (i IP) validForHostname(hn HostString) (IP, error) {
  56. log.Traceln(errors.HostIP, i, hn)
  57. if _, t := i.Type(); t == NoIP || (t&SysIP) == SysIP {
  58. log.Traceln(errors.HostIP, errors.HostIPIsInvalid)
  59. return nil, errors.HostIPIsInvalid
  60. }
  61. /*f := false
  62. if lhn, _ := os.Hostname(); lhn == hn.String() {
  63. addrs, err := net.InterfaceAddrs()
  64. if err != nil {
  65. log.Traceln(errors.HostIP, err)
  66. return nil, err
  67. }
  68. for _, addr := range addrs {
  69. if addr.(*net.IPNet).Contains(i.AsIP()) {
  70. f = true
  71. break
  72. }
  73. }
  74. } else {
  75. addrs, err := net.LookupIP(hn.String())
  76. if err != nil {
  77. log.Traceln(errors.HostIP, err)
  78. return nil, err
  79. }
  80. for _, addr := range addrs {
  81. if addr.String() == i.String() {
  82. f = true
  83. }
  84. }
  85. }
  86. if f == false {
  87. log.Traceln(errors.HostIP, errors.HostIPIsInvalid)
  88. return nil, errors.HostIPIsInvalid
  89. }*/
  90. return i, nil
  91. }