ganserv.go 3.5 KB

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