From 2e716da23f6f1545e5d386b954a3f9fb2e275298 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Fri, 25 Aug 2023 17:59:59 +0000 Subject: [PATCH] wireguard: Config.WriteTo() Signed-off-by: Alejandro Mery --- pkg/wireguard/config.go | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/pkg/wireguard/config.go b/pkg/wireguard/config.go index 931e37b..6d34594 100644 --- a/pkg/wireguard/config.go +++ b/pkg/wireguard/config.go @@ -1,17 +1,35 @@ package wireguard import ( + "bytes" "errors" "fmt" "io" "net/netip" "strconv" "strings" + "text/template" "darvaza.org/core" "gopkg.in/gcfg.v1" ) +var configTemplate = template.Must(template.New("config").Funcs(template.FuncMap{ + "StringsJoin": strings.Join, +}).Parse(`[Interface] +Address = {{.Interface.Address}} +PrivateKey = {{.Interface.PrivateKey}} +ListenPort = {{.Interface.ListenPort}} +{{range .Peer}} + +[Peer] +# {{.Endpoint.Name}} +PublicKey = {{.PublicKey}} +Endpoint = {{.Endpoint}} +AllowedIPs = {{ StringsJoin .AllowedIPs ", "}} +{{end}} +`)) + // Config represents a wgN.conf file type Config struct { Interface InterfaceConfig @@ -19,13 +37,24 @@ type Config struct { } // GetAddress is a shortcut to the interface's address -func (f *Config) GetAddress() netip.Addr { - return f.Interface.Address +func (wg *Config) GetAddress() netip.Addr { + return wg.Interface.Address } // Peers tells how many peers are described -func (f *Config) Peers() int { - return len(f.Peer) +func (wg *Config) Peers() int { + return len(wg.Peer) +} + +// WriteTo writes a Wireguard [Config] onto the provided [io.Writer] +func (wg *Config) WriteTo(w io.Writer) (int64, error) { + var buf bytes.Buffer + + if err := configTemplate.Execute(&buf, wg); err != nil { + return 0, err + } + + return buf.WriteTo(w) } // InterfaceConfig represents the [Interface] section