mirror of https://github.com/h44z/wg-portal.git
				
				
				
			
		
			
				
	
	
		
			181 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Go
		
	
	
	
package model
 | 
						|
 | 
						|
import (
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/h44z/wg-portal/internal"
 | 
						|
	"github.com/h44z/wg-portal/internal/config"
 | 
						|
	"github.com/h44z/wg-portal/internal/domain"
 | 
						|
)
 | 
						|
 | 
						|
type Interface struct {
 | 
						|
	Identifier     string `json:"Identifier" example:"wg0"`      // device name, for example: wg0
 | 
						|
	DisplayName    string `json:"DisplayName"`                   // a nice display name/ description for the interface
 | 
						|
	Mode           string `json:"Mode" example:"server"`         // the interface type, either 'server', 'client' or 'any'
 | 
						|
	Backend        string `json:"Backend" example:"local"`       // the backend used for this interface e.g., local, mikrotik, ...
 | 
						|
	PrivateKey     string `json:"PrivateKey" example:"abcdef=="` // private Key of the server interface
 | 
						|
	PublicKey      string `json:"PublicKey" example:"abcdef=="`  // public Key of the server interface
 | 
						|
	Disabled       bool   `json:"Disabled"`                      // flag that specifies if the interface is enabled (up) or not (down)
 | 
						|
	DisabledReason string `json:"DisabledReason"`                // the reason why the interface has been disabled
 | 
						|
	SaveConfig     bool   `json:"SaveConfig"`                    // automatically persist config changes to the wgX.conf file
 | 
						|
 | 
						|
	ListenPort   int      `json:"ListenPort"`   // the listening port, for example: 51820
 | 
						|
	Addresses    []string `json:"Addresses"`    // the interface ip addresses
 | 
						|
	Dns          []string `json:"Dns"`          // the dns server that should be set if the interface is up, comma separated
 | 
						|
	DnsSearch    []string `json:"DnsSearch"`    // the dns search option string that should be set if the interface is up, will be appended to DnsStr
 | 
						|
	Mtu          int      `json:"Mtu"`          // the device MTU
 | 
						|
	FirewallMark uint32   `json:"FirewallMark"` // a firewall mark
 | 
						|
	RoutingTable string   `json:"RoutingTable"` // the routing table
 | 
						|
 | 
						|
	PreUp    string `json:"PreUp"`    // action that is executed before the device is up
 | 
						|
	PostUp   string `json:"PostUp"`   // action that is executed after the device is up
 | 
						|
	PreDown  string `json:"PreDown"`  // action that is executed before the device is down
 | 
						|
	PostDown string `json:"PostDown"` // action that is executed after the device is down
 | 
						|
 | 
						|
	PeerDefNetwork             []string `json:"PeerDefNetwork"`             // the default subnets from which peers will get their IP addresses, comma seperated
 | 
						|
	PeerDefDns                 []string `json:"PeerDefDns"`                 // the default dns server for the peer
 | 
						|
	PeerDefDnsSearch           []string `json:"PeerDefDnsSearch"`           // the default dns search options for the peer
 | 
						|
	PeerDefEndpoint            string   `json:"PeerDefEndpoint"`            // the default endpoint for the peer
 | 
						|
	PeerDefAllowedIPs          []string `json:"PeerDefAllowedIPs"`          // the default allowed IP string for the peer
 | 
						|
	PeerDefMtu                 int      `json:"PeerDefMtu"`                 // the default device MTU
 | 
						|
	PeerDefPersistentKeepalive int      `json:"PeerDefPersistentKeepalive"` // the default persistent keep-alive Value
 | 
						|
	PeerDefFirewallMark        uint32   `json:"PeerDefFirewallMark"`        // default firewall mark
 | 
						|
	PeerDefRoutingTable        string   `json:"PeerDefRoutingTable"`        // the default routing table
 | 
						|
 | 
						|
	PeerDefPreUp    string `json:"PeerDefPreUp"`    // default action that is executed before the device is up
 | 
						|
	PeerDefPostUp   string `json:"PeerDefPostUp"`   // default action that is executed after the device is up
 | 
						|
	PeerDefPreDown  string `json:"PeerDefPreDown"`  // default action that is executed before the device is down
 | 
						|
	PeerDefPostDown string `json:"PeerDefPostDown"` // default action that is executed after the device is down
 | 
						|
 | 
						|
	// Calculated values
 | 
						|
 | 
						|
	EnabledPeers int    `json:"EnabledPeers"`
 | 
						|
	TotalPeers   int    `json:"TotalPeers"`
 | 
						|
	Filename     string `json:"Filename"` // the filename of the config file, for example: wg0.conf
 | 
						|
}
 | 
						|
 | 
						|
func NewInterface(src *domain.Interface, peers []domain.Peer) *Interface {
 | 
						|
	iface := &Interface{
 | 
						|
		Identifier:                 string(src.Identifier),
 | 
						|
		DisplayName:                src.DisplayName,
 | 
						|
		Mode:                       string(src.Type),
 | 
						|
		Backend:                    string(src.Backend),
 | 
						|
		PrivateKey:                 src.PrivateKey,
 | 
						|
		PublicKey:                  src.PublicKey,
 | 
						|
		Disabled:                   src.IsDisabled(),
 | 
						|
		DisabledReason:             src.DisabledReason,
 | 
						|
		SaveConfig:                 src.SaveConfig,
 | 
						|
		ListenPort:                 src.ListenPort,
 | 
						|
		Addresses:                  domain.CidrsToStringSlice(src.Addresses),
 | 
						|
		Dns:                        internal.SliceString(src.DnsStr),
 | 
						|
		DnsSearch:                  internal.SliceString(src.DnsSearchStr),
 | 
						|
		Mtu:                        src.Mtu,
 | 
						|
		FirewallMark:               src.FirewallMark,
 | 
						|
		RoutingTable:               src.RoutingTable,
 | 
						|
		PreUp:                      src.PreUp,
 | 
						|
		PostUp:                     src.PostUp,
 | 
						|
		PreDown:                    src.PreDown,
 | 
						|
		PostDown:                   src.PostDown,
 | 
						|
		PeerDefNetwork:             internal.SliceString(src.PeerDefNetworkStr),
 | 
						|
		PeerDefDns:                 internal.SliceString(src.PeerDefDnsStr),
 | 
						|
		PeerDefDnsSearch:           internal.SliceString(src.PeerDefDnsSearchStr),
 | 
						|
		PeerDefEndpoint:            src.PeerDefEndpoint,
 | 
						|
		PeerDefAllowedIPs:          internal.SliceString(src.PeerDefAllowedIPsStr),
 | 
						|
		PeerDefMtu:                 src.PeerDefMtu,
 | 
						|
		PeerDefPersistentKeepalive: src.PeerDefPersistentKeepalive,
 | 
						|
		PeerDefFirewallMark:        src.PeerDefFirewallMark,
 | 
						|
		PeerDefRoutingTable:        src.PeerDefRoutingTable,
 | 
						|
		PeerDefPreUp:               src.PeerDefPreUp,
 | 
						|
		PeerDefPostUp:              src.PeerDefPostUp,
 | 
						|
		PeerDefPreDown:             src.PeerDefPreDown,
 | 
						|
		PeerDefPostDown:            src.PeerDefPostDown,
 | 
						|
 | 
						|
		EnabledPeers: 0,
 | 
						|
		TotalPeers:   0,
 | 
						|
		Filename:     src.GetConfigFileName(),
 | 
						|
	}
 | 
						|
 | 
						|
	if iface.Backend == "" {
 | 
						|
		iface.Backend = config.LocalBackendName // default to local backend
 | 
						|
	}
 | 
						|
 | 
						|
	if len(peers) > 0 {
 | 
						|
		iface.TotalPeers = len(peers)
 | 
						|
 | 
						|
		activePeers := 0
 | 
						|
		for _, peer := range peers {
 | 
						|
			if !peer.IsDisabled() {
 | 
						|
				activePeers++
 | 
						|
			}
 | 
						|
		}
 | 
						|
		iface.EnabledPeers = activePeers
 | 
						|
	}
 | 
						|
 | 
						|
	return iface
 | 
						|
}
 | 
						|
 | 
						|
func NewInterfaces(src []domain.Interface, srcPeers [][]domain.Peer) []Interface {
 | 
						|
	results := make([]Interface, len(src))
 | 
						|
	for i := range src {
 | 
						|
		if srcPeers == nil {
 | 
						|
			results[i] = *NewInterface(&src[i], nil)
 | 
						|
		} else {
 | 
						|
			results[i] = *NewInterface(&src[i], srcPeers[i])
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return results
 | 
						|
}
 | 
						|
 | 
						|
func NewDomainInterface(src *Interface) *domain.Interface {
 | 
						|
	now := time.Now()
 | 
						|
 | 
						|
	cidrs, _ := domain.CidrsFromArray(src.Addresses)
 | 
						|
 | 
						|
	res := &domain.Interface{
 | 
						|
		BaseModel:  domain.BaseModel{},
 | 
						|
		Identifier: domain.InterfaceIdentifier(src.Identifier),
 | 
						|
		KeyPair: domain.KeyPair{
 | 
						|
			PrivateKey: src.PrivateKey,
 | 
						|
			PublicKey:  src.PublicKey,
 | 
						|
		},
 | 
						|
		ListenPort:                 src.ListenPort,
 | 
						|
		Addresses:                  cidrs,
 | 
						|
		DnsStr:                     internal.SliceToString(src.Dns),
 | 
						|
		DnsSearchStr:               internal.SliceToString(src.DnsSearch),
 | 
						|
		Mtu:                        src.Mtu,
 | 
						|
		FirewallMark:               src.FirewallMark,
 | 
						|
		RoutingTable:               src.RoutingTable,
 | 
						|
		PreUp:                      src.PreUp,
 | 
						|
		PostUp:                     src.PostUp,
 | 
						|
		PreDown:                    src.PreDown,
 | 
						|
		PostDown:                   src.PostDown,
 | 
						|
		SaveConfig:                 src.SaveConfig,
 | 
						|
		DisplayName:                src.DisplayName,
 | 
						|
		Type:                       domain.InterfaceType(src.Mode),
 | 
						|
		Backend:                    domain.InterfaceBackend(src.Backend),
 | 
						|
		DriverType:                 "",  // currently unused
 | 
						|
		Disabled:                   nil, // set below
 | 
						|
		DisabledReason:             src.DisabledReason,
 | 
						|
		PeerDefNetworkStr:          internal.SliceToString(src.PeerDefNetwork),
 | 
						|
		PeerDefDnsStr:              internal.SliceToString(src.PeerDefDns),
 | 
						|
		PeerDefDnsSearchStr:        internal.SliceToString(src.PeerDefDnsSearch),
 | 
						|
		PeerDefEndpoint:            src.PeerDefEndpoint,
 | 
						|
		PeerDefAllowedIPsStr:       internal.SliceToString(src.PeerDefAllowedIPs),
 | 
						|
		PeerDefMtu:                 src.PeerDefMtu,
 | 
						|
		PeerDefPersistentKeepalive: src.PeerDefPersistentKeepalive,
 | 
						|
		PeerDefFirewallMark:        src.PeerDefFirewallMark,
 | 
						|
		PeerDefRoutingTable:        src.PeerDefRoutingTable,
 | 
						|
		PeerDefPreUp:               src.PeerDefPreUp,
 | 
						|
		PeerDefPostUp:              src.PeerDefPostUp,
 | 
						|
		PeerDefPreDown:             src.PeerDefPreDown,
 | 
						|
		PeerDefPostDown:            src.PeerDefPostDown,
 | 
						|
	}
 | 
						|
 | 
						|
	if src.Disabled {
 | 
						|
		res.Disabled = &now
 | 
						|
	}
 | 
						|
 | 
						|
	return res
 | 
						|
}
 |