Add Wireguard Config Generation

This commit is contained in:
Samuel Lorch 2023-05-06 21:14:16 +02:00
parent a67911df67
commit 7545e2fcbb
3 changed files with 69 additions and 7 deletions

View file

@ -31,6 +31,11 @@ type BridgeMembership struct {
BridgeName string BridgeName string
} }
type NameAndConfig struct {
Name string
Config config.Config
}
func GenerateNetworkdConfiguration(conf config.Config) ([]NetworkdConfigFile, error) { func GenerateNetworkdConfiguration(conf config.Config) ([]NetworkdConfigFile, error) {
files := []NetworkdConfigFile{} files := []NetworkdConfigFile{}
@ -88,7 +93,23 @@ func GenerateNetworkdConfiguration(conf config.Config) ([]NetworkdConfigFile, er
} }
} }
// Step 4 Generate Bond Members // Step 4 Generate wireguard netdev files
for name := range conf.VPN.Wireguard.Interfaces {
buf := new(bytes.Buffer)
err := templates.ExecuteTemplate(buf, "create-wireguard.netdev.tmpl", NameAndConfig{
Name: name,
Config: conf,
})
if err != nil {
return nil, fmt.Errorf("executing create-wireguard.netdev.tmpl template: %w", err)
}
files = append(files, NetworkdConfigFile{
Name: fmt.Sprintf("40-create-wireguard-%v.netdev", name),
Content: buf.String(),
})
}
// Step 5 Generate Bond Members
for name, inter := range conf.Network.Interfaces { for name, inter := range conf.Network.Interfaces {
if inter.Type == network.Bond && inter.BondMembers != nil { if inter.Type == network.Bond && inter.BondMembers != nil {
for _, member := range *inter.BondMembers { for _, member := range *inter.BondMembers {
@ -101,14 +122,14 @@ func GenerateNetworkdConfiguration(conf config.Config) ([]NetworkdConfigFile, er
return nil, fmt.Errorf("executing bond-membership.network.tmpl template: %w", err) return nil, fmt.Errorf("executing bond-membership.network.tmpl template: %w", err)
} }
files = append(files, NetworkdConfigFile{ files = append(files, NetworkdConfigFile{
Name: fmt.Sprintf("40-bond-membership-%v.network", name), Name: fmt.Sprintf("50-bond-membership-%v.network", name),
Content: buf.String(), Content: buf.String(),
}) })
} }
} }
} }
// Step 5 Generate Bridge Members // Step 6 Generate Bridge Members
for name, inter := range conf.Network.Interfaces { for name, inter := range conf.Network.Interfaces {
if inter.Type == network.Bridge && inter.BridgeMembers != nil { if inter.Type == network.Bridge && inter.BridgeMembers != nil {
for _, member := range *inter.BridgeMembers { for _, member := range *inter.BridgeMembers {
@ -121,14 +142,14 @@ func GenerateNetworkdConfiguration(conf config.Config) ([]NetworkdConfigFile, er
return nil, fmt.Errorf("executing bridge-membership.network.tmpl template: %w", err) return nil, fmt.Errorf("executing bridge-membership.network.tmpl template: %w", err)
} }
files = append(files, NetworkdConfigFile{ files = append(files, NetworkdConfigFile{
Name: fmt.Sprintf("50-bridge-membership-%v.network", name), Name: fmt.Sprintf("60-bridge-membership-%v.network", name),
Content: buf.String(), Content: buf.String(),
}) })
} }
} }
} }
// Step 6 Generate addressing network files // Step 7 Generate addressing network files
for name, inter := range conf.Network.Interfaces { for name, inter := range conf.Network.Interfaces {
// Vlans // Vlans
vlans := []string{} vlans := []string{}
@ -162,7 +183,7 @@ func GenerateNetworkdConfiguration(conf config.Config) ([]NetworkdConfigFile, er
return nil, fmt.Errorf("executing config-addressing.network.tmpl template: %w", err) return nil, fmt.Errorf("executing config-addressing.network.tmpl template: %w", err)
} }
files = append(files, NetworkdConfigFile{ files = append(files, NetworkdConfigFile{
Name: fmt.Sprintf("60-config-addressing-%v.network", name), Name: fmt.Sprintf("70-config-addressing-%v.network", name),
Content: buf.String(), Content: buf.String(),
}) })
} }

View file

@ -3,6 +3,9 @@ package networkd
import ( import (
"embed" "embed"
"text/template" "text/template"
"nfsense.net/nfsense/internal/definitions/config"
"nfsense.net/nfsense/internal/definitions/object"
) )
//go:embed template //go:embed template
@ -12,8 +15,22 @@ var templates *template.Template
func init() { func init() {
var err error var err error
templates, err = template.New("").ParseFS(templateFS, "template/*.tmpl") templates, err = template.New("").Funcs(template.FuncMap{
"getAddressObjectsAsCidr": getAddressObjectsAsCidr,
}).ParseFS(templateFS, "template/*.tmpl")
if err != nil { if err != nil {
panic(err) panic(err)
} }
} }
func getAddressObjectsAsCidr(conf config.Config, name string) string {
addr := conf.Object.Addresses[name]
switch addr.Type {
case object.Host:
return addr.Host.String() + "/32"
case object.NetworkAddress:
return addr.NetworkAddress.String()
default:
panic("unsupported Address Type")
}
}

View file

@ -0,0 +1,24 @@
[NetDev]
Name={{ $.Name }}
Kind=wireguard
{{- $intertface := index $.Config.VPN.Wireguard.Interfaces .Name }}
[WireGuard]
ListenPort={{ $intertface.ListenPort }}
PrivateKey={{ $intertface.PrivateKey }}
{{ range $i, $peerName := $intertface.Peers }}
{{- $peer := index $.Config.VPN.Wireguard.Peers $peerName }}
[WireGuardPeer]
PublicKey={{ $peer.PublicKey }}
{{- if ne $peer.PresharedKey nil }}
PresharedKey={{ $peer.PresharedKey }}
{{- end }}
{{range $i, $allowedIpName := $peer.AllowedIPs }}
AllowedIPs={{ getAddressObjectsAsCidr $.Config $allowedIpName}}
{{- end }}
{{- if ne $peer.Endpoint nil }}
Endpoint={{ $peer.Endpoint }}
{{- end }}
{{- end }}