123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- 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 {
- option.Database.NewTable("ganserv")
- existingNetworks := []*Network{}
- if option.Database.KeyExists("ganserv", "networks") {
- option.Database.Read("ganserv", "networks", &existingNetworks)
- }
- return &NetworkManager{
- option: option,
- networks: existingNetworks,
- }
- }
- //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)
- //Write the latest network list into database
- m.option.Database.Write("ganserv", "networks", m.networks)
- 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:]...)
- //Write the latest network list into database
- m.option.Database.Write("ganserv", "networks", m.networks)
- 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
- }
|