ganserv.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package ganserv
  2. import (
  3. "log"
  4. "net"
  5. "imuslab.com/zoraxy/mod/database"
  6. )
  7. /*
  8. Global Area Network
  9. Server side implementation
  10. This module do a few things to help manage
  11. the system GANs
  12. - Provide DHCP assign to client
  13. - Provide a list of connected nodes in the same VLAN
  14. - Provide proxy of packet if the target VLAN is online but not reachable
  15. Also provide HTTP Handler functions for management
  16. - Create Network
  17. - Update Network Properties (Name / Desc)
  18. - Delete Network
  19. - Authorize Node
  20. - Deauthorize Node
  21. - Set / Get Network Prefered Subnet Mask
  22. - Handle Node ping
  23. */
  24. type Node struct {
  25. Auth bool //If the node is authorized in this network
  26. ClientID string //The client ID
  27. MAC string //The tap MAC this client is using
  28. Name string //Name of the client in this network
  29. Description string //Description text
  30. ManagedIP net.IP //The IP address assigned by this network
  31. LastSeen int64 //Last time it is seen from this host
  32. ClientVersion string //Client application version
  33. PublicIP net.IP //Public IP address as seen from this host
  34. }
  35. type Network struct {
  36. UID string //UUID of the network, must be a 16 char random ASCII string
  37. Name string //Name of the network, ASCII only
  38. Description string //Description of the network
  39. CIDR string //The subnet masked use by this network
  40. Nodes []*Node //The nodes currently attached in this network
  41. }
  42. type NetworkManagerOptions struct {
  43. Database *database.Database
  44. AuthToken string
  45. ApiPort int
  46. }
  47. type NetworkMetaData struct {
  48. Desc string
  49. }
  50. type MemberMetaData struct {
  51. Name string
  52. }
  53. type NetworkManager struct {
  54. authToken string
  55. apiPort int
  56. ControllerID string
  57. option *NetworkManagerOptions
  58. networksMetadata map[string]NetworkMetaData
  59. }
  60. // Create a new GAN manager
  61. func NewNetworkManager(option *NetworkManagerOptions) *NetworkManager {
  62. option.Database.NewTable("ganserv")
  63. //Load network metadata
  64. networkMeta := map[string]NetworkMetaData{}
  65. if option.Database.KeyExists("ganserv", "networkmeta") {
  66. option.Database.Read("ganserv", "networkmeta", &networkMeta)
  67. }
  68. //Start the zerotier instance if not exists
  69. //Get controller info
  70. instanceInfo, err := getControllerInfo(option.AuthToken, option.ApiPort)
  71. if err != nil {
  72. log.Println("ZeroTier connection failed: ", err.Error())
  73. return &NetworkManager{
  74. authToken: option.AuthToken,
  75. apiPort: option.ApiPort,
  76. ControllerID: "",
  77. option: option,
  78. networksMetadata: networkMeta,
  79. }
  80. }
  81. return &NetworkManager{
  82. authToken: option.AuthToken,
  83. apiPort: option.ApiPort,
  84. ControllerID: instanceInfo.Address,
  85. option: option,
  86. networksMetadata: networkMeta,
  87. }
  88. }
  89. func (m *NetworkManager) GetNetworkMetaData(netid string) *NetworkMetaData {
  90. md, ok := m.networksMetadata[netid]
  91. if !ok {
  92. return &NetworkMetaData{}
  93. }
  94. return &md
  95. }
  96. func (m *NetworkManager) WriteNetworkMetaData(netid string, meta *NetworkMetaData) {
  97. m.networksMetadata[netid] = *meta
  98. m.option.Database.Write("ganserv", "networkmeta", m.networksMetadata)
  99. }
  100. func (m *NetworkManager) GetMemberMetaData(netid string, memid string) *MemberMetaData {
  101. thisMemberData := MemberMetaData{}
  102. m.option.Database.Read("ganserv", "memberdata_"+netid+"_"+memid, &thisMemberData)
  103. return &thisMemberData
  104. }
  105. func (m *NetworkManager) WriteMemeberMetaData(netid string, memid string, meta *MemberMetaData) {
  106. m.option.Database.Write("ganserv", "memberdata_"+netid+"_"+memid, meta)
  107. }