mirror of
https://github.com/luscis/openlan.git
synced 2025-10-05 08:36:59 +08:00
162 lines
3.6 KiB
Go
Executable File
162 lines
3.6 KiB
Go
Executable File
package config
|
|
|
|
import (
|
|
"net"
|
|
"path/filepath"
|
|
|
|
"github.com/luscis/openlan/pkg/libol"
|
|
)
|
|
|
|
type Network struct {
|
|
ConfDir string `json:"-"`
|
|
File string `json:"file"`
|
|
Alias string `json:"-"`
|
|
Name string `json:"name"`
|
|
Provider string `json:"provider,omitempty"`
|
|
Bridge *Bridge `json:"bridge,omitempty"`
|
|
Subnet *Subnet `json:"subnet,omitempty"`
|
|
OpenVPN *OpenVPN `json:"openvpn,omitempty"`
|
|
Links []Point `json:"links,omitempty"`
|
|
Hosts []HostLease `json:"hosts,omitempty"`
|
|
Routes []PrefixRoute `json:"routes,omitempty"`
|
|
Acl string `json:"acl,omitempty"`
|
|
Specifies interface{} `json:"specifies,omitempty"`
|
|
Dhcp string `json:"dhcp,omitempty"`
|
|
Outputs []Output `json:"outputs"`
|
|
}
|
|
|
|
func (n *Network) NewSpecifies() interface{} {
|
|
switch n.Provider {
|
|
case "esp":
|
|
n.Specifies = &ESPSpecifies{}
|
|
case "vxlan":
|
|
n.Specifies = &VxLANSpecifies{}
|
|
case "fabric":
|
|
n.Specifies = &FabricSpecifies{}
|
|
case "router":
|
|
n.Specifies = &RouterSpecifies{}
|
|
default:
|
|
n.Specifies = nil
|
|
}
|
|
return n.Specifies
|
|
}
|
|
|
|
func (n *Network) Correct() {
|
|
if n.Bridge == nil {
|
|
n.Bridge = &Bridge{}
|
|
}
|
|
br := n.Bridge
|
|
br.Network = n.Name
|
|
br.Correct()
|
|
switch n.Provider {
|
|
case "esp":
|
|
spec := n.Specifies
|
|
if obj, ok := spec.(*ESPSpecifies); ok {
|
|
obj.Correct()
|
|
obj.Name = n.Name
|
|
}
|
|
case "fabric":
|
|
// 28 [udp] - 8 [esp] -
|
|
// 28 [udp] - 8 [vxlan] -
|
|
// 14 [ethernet] - tcp [40] - 1332 [mss] -
|
|
// 42 [padding] ~= variable 30-45
|
|
if br.Mss == 0 {
|
|
br.Mss = 1332
|
|
}
|
|
spec := n.Specifies
|
|
if obj, ok := spec.(*FabricSpecifies); ok {
|
|
obj.Correct()
|
|
obj.Name = n.Name
|
|
}
|
|
case "router":
|
|
spec := n.Specifies
|
|
if obj, ok := spec.(*RouterSpecifies); ok {
|
|
obj.Correct()
|
|
obj.Name = n.Name
|
|
}
|
|
}
|
|
if n.Subnet == nil {
|
|
n.Subnet = &Subnet{}
|
|
}
|
|
ipAddr := ""
|
|
ipMask := ""
|
|
if _i, _n, err := net.ParseCIDR(br.Address); err == nil {
|
|
ipAddr = _i.String()
|
|
ipMask = net.IP(_n.Mask).String()
|
|
}
|
|
if n.Subnet.Netmask == "" {
|
|
n.Subnet.Netmask = ipMask
|
|
}
|
|
CorrectRoutes(n.Routes, ipAddr)
|
|
if n.OpenVPN != nil {
|
|
n.OpenVPN.Network = n.Name
|
|
obj := DefaultOpenVPN()
|
|
n.OpenVPN.Merge(obj)
|
|
n.OpenVPN.Correct()
|
|
}
|
|
}
|
|
|
|
func (n *Network) Dir(elem ...string) string {
|
|
args := append([]string{n.ConfDir}, elem...)
|
|
return filepath.Join(args...)
|
|
}
|
|
|
|
func (n *Network) LoadLink() {
|
|
file := n.Dir("link", n.Name+".json")
|
|
if err := libol.FileExist(file); err == nil {
|
|
if err := libol.UnmarshalLoad(&n.Links, file); err != nil {
|
|
libol.Error("Network.LoadLink... %n", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (n *Network) LoadRoute() {
|
|
file := n.Dir("route", n.Name+".json")
|
|
if err := libol.FileExist(file); err == nil {
|
|
if err := libol.UnmarshalLoad(&n.Routes, file); err != nil {
|
|
libol.Error("Network.LoadRoute... %n", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (n *Network) Save() {
|
|
obj := *n
|
|
obj.Routes = nil
|
|
obj.Links = nil
|
|
if err := libol.MarshalSave(&obj, obj.File, true); err != nil {
|
|
libol.Error("Network.Save %s %s", obj.Name, err)
|
|
}
|
|
n.SaveRoute()
|
|
n.SaveLink()
|
|
}
|
|
|
|
func (n *Network) SaveRoute() {
|
|
file := n.Dir("route", n.Name+".json")
|
|
if n.Routes == nil {
|
|
return
|
|
}
|
|
if err := libol.MarshalSave(n.Routes, file, true); err != nil {
|
|
libol.Error("Network.SaveRoute %s %s", n.Name, err)
|
|
}
|
|
}
|
|
|
|
func (n *Network) SaveLink() {
|
|
file := n.Dir("link", n.Name+".json")
|
|
if n.Links == nil {
|
|
return
|
|
}
|
|
if err := libol.MarshalSave(n.Links, file, true); err != nil {
|
|
libol.Error("Network.SaveLink %s %s", n.Name, err)
|
|
}
|
|
}
|
|
|
|
func (n *Network) Reload() {
|
|
switch n.Provider {
|
|
case "esp":
|
|
spec := n.Specifies
|
|
if obj, ok := spec.(*ESPSpecifies); ok {
|
|
obj.Correct()
|
|
}
|
|
}
|
|
}
|