|
@@ -0,0 +1,104 @@
|
|
|
+package ganserv
|
|
|
+
|
|
|
+import (
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+ "net"
|
|
|
+
|
|
|
+ "imuslab.com/zoraxy/mod/database"
|
|
|
+)
|
|
|
+
|
|
|
+/*
|
|
|
+ Global Area Network
|
|
|
+ Server side implementation
|
|
|
+
|
|
|
+ This module do a few things to help manage
|
|
|
+ the system GANs
|
|
|
+
|
|
|
+ - Provide DHCP assign to client
|
|
|
+ - Provide a list of connected nodes in the same VLAN
|
|
|
+ - Provide proxy of packet if the target VLAN is online but not reachable
|
|
|
+
|
|
|
+ Also provide HTTP Handler functions for management
|
|
|
+ - Create Network
|
|
|
+ - Update Network Properties (Name / Desc)
|
|
|
+ - Delete Network
|
|
|
+
|
|
|
+ - Authorize Node
|
|
|
+ - Deauthorize Node
|
|
|
+ - Set / Get Network Prefered Subnet Mask
|
|
|
+ - Handle Node ping
|
|
|
+*/
|
|
|
+
|
|
|
+type Node struct {
|
|
|
+ Auth bool //If the node is authorized in this network
|
|
|
+ ClientID string //The client ID
|
|
|
+ MAC string //The tap MAC this client is using
|
|
|
+ Name string //Name of the client in this network
|
|
|
+ Description string //Description text
|
|
|
+ ManagedIP net.IP //The IP address assigned by this network
|
|
|
+ LastSeen int64 //Last time it is seen from this host
|
|
|
+ ClientVersion string //Client application version
|
|
|
+ PublicIP net.IP //Public IP address as seen from this host
|
|
|
+}
|
|
|
+
|
|
|
+type Network struct {
|
|
|
+ UID string //UUID of the network, must be a 16 char random ASCII string
|
|
|
+ Name string //Name of the network, ASCII only
|
|
|
+ Description string //Description of the network
|
|
|
+ CIDR string //The subnet masked use by this network
|
|
|
+ Nodes []*Node //The nodes currently attached in this network
|
|
|
+}
|
|
|
+
|
|
|
+type NetworkManagerOptions struct {
|
|
|
+ Database *database.Database
|
|
|
+}
|
|
|
+
|
|
|
+type NetworkManager struct {
|
|
|
+ option *NetworkManagerOptions
|
|
|
+ networks []*Network
|
|
|
+}
|
|
|
+
|
|
|
+//Create a new GAN manager
|
|
|
+func NewNetworkManager(option *NetworkManagerOptions) *NetworkManager {
|
|
|
+ return &NetworkManager{
|
|
|
+ option: option,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//List all the networks within this network manager
|
|
|
+func (m *NetworkManager) ListNetworks() []*Network {
|
|
|
+ return m.networks
|
|
|
+}
|
|
|
+
|
|
|
+func (m *NetworkManager) AddNetwork(n *Network) error {
|
|
|
+ if m.NetworkExists(n.UID) {
|
|
|
+ return errors.New("network with given id already exists")
|
|
|
+ }
|
|
|
+ m.networks = append(m.networks, n)
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (m *NetworkManager) RemoveNetwork(id string) error {
|
|
|
+ for i, n := range m.networks {
|
|
|
+ if n.UID == id {
|
|
|
+ m.networks = append(m.networks[:i], m.networks[i+1:]...)
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return fmt.Errorf("network not found: %s", id)
|
|
|
+}
|
|
|
+
|
|
|
+func (m *NetworkManager) GetNetworkByID(id string) (*Network, error) {
|
|
|
+ for _, n := range m.networks {
|
|
|
+ if n.UID == id {
|
|
|
+ return n, nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil, fmt.Errorf("network not found: %s", id)
|
|
|
+}
|
|
|
+
|
|
|
+func (m *NetworkManager) NetworkExists(id string) bool {
|
|
|
+ _, err := m.GetNetworkByID(id)
|
|
|
+ return err == nil
|
|
|
+}
|