1
0

ganserv.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. //Start the zerotier instance if not exists
  63. //Get controller info
  64. instanceInfo, err := getControllerInfo(option.AuthToken, option.ApiPort)
  65. if err != nil {
  66. panic(err)
  67. }
  68. //Load network metadata
  69. networkMeta := map[string]NetworkMetaData{}
  70. if option.Database.KeyExists("ganserv", "networkmeta") {
  71. option.Database.Read("ganserv", "networkmeta", &networkMeta)
  72. }
  73. return &NetworkManager{
  74. authToken: option.AuthToken,
  75. apiPort: option.ApiPort,
  76. ControllerID: instanceInfo.Address,
  77. option: option,
  78. networksMetadata: networkMeta,
  79. }
  80. }
  81. func (m *NetworkManager) GetNetworkMetaData(netid string) *NetworkMetaData {
  82. md, ok := m.networksMetadata[netid]
  83. if !ok {
  84. return &NetworkMetaData{}
  85. }
  86. return &md
  87. }
  88. func (m *NetworkManager) WriteNetworkMetaData(netid string, meta *NetworkMetaData) {
  89. m.networksMetadata[netid] = *meta
  90. m.option.Database.Write("ganserv", "networkmeta", m.networksMetadata)
  91. }
  92. func (m *NetworkManager) GetMemberMetaData(netid string, memid string) *MemberMetaData {
  93. thisMemberData := MemberMetaData{}
  94. m.option.Database.Read("ganserv", "memberdata_"+netid+"_"+memid, &thisMemberData)
  95. return &thisMemberData
  96. }
  97. func (m *NetworkManager) WriteMemeberMetaData(netid string, memid string, meta *MemberMetaData) {
  98. m.option.Database.Write("ganserv", "memberdata_"+netid+"_"+memid, meta)
  99. }