From c6fedd9214871424d4a05269472e96e632eaafce Mon Sep 17 00:00:00 2001 From: "Quentin McGaw (desktop)" Date: Sat, 28 Aug 2021 18:43:23 +0000 Subject: [PATCH] Feat: support csv addresses in `WIREGUARD_ADDRESS` --- internal/configuration/wireguard.go | 43 +++++++++++++++++++--------- internal/provider/utils/wireguard.go | 14 +++++---- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/internal/configuration/wireguard.go b/internal/configuration/wireguard.go index f18ed6bf..4cc9209d 100644 --- a/internal/configuration/wireguard.go +++ b/internal/configuration/wireguard.go @@ -10,10 +10,10 @@ import ( // Wireguard contains settings to configure the Wireguard client. type Wireguard struct { - PrivateKey string `json:"privatekey"` - PreSharedKey string `json:"presharedkey"` - Address *net.IPNet `json:"address"` - Interface string `json:"interface"` + PrivateKey string `json:"privatekey"` + PreSharedKey string `json:"presharedkey"` + Addresses []*net.IPNet `json:"addresses"` + Interface string `json:"interface"` } func (settings *Wireguard) String() string { @@ -33,8 +33,11 @@ func (settings *Wireguard) lines() (lines []string) { lines = append(lines, indent+lastIndent+"Pre-shared key is set") } - if settings.Address != nil { - lines = append(lines, indent+lastIndent+"Address: "+settings.Address.String()) + if len(settings.Addresses) > 0 { + lines = append(lines, indent+lastIndent+"Addresses: ") + for _, address := range settings.Addresses { + lines = append(lines, indent+indent+lastIndent+address.String()) + } } return lines @@ -53,16 +56,10 @@ func (settings *Wireguard) read(r reader) (err error) { return fmt.Errorf("environment variable WIREGUARD_PRESHARED_KEY: %w", err) } - addressString, err := r.env.Get("WIREGUARD_ADDRESS", params.Compulsory()) + err = settings.readAddresses(r.env) if err != nil { - return fmt.Errorf("environment variable WIREGUARD_ADDRESS: %w", err) + return err } - ip, ipNet, err := net.ParseCIDR(addressString) - if err != nil { - return fmt.Errorf("environment variable WIREGUARD_ADDRESS: %w", err) - } - ipNet.IP = ip - settings.Address = ipNet settings.Interface, err = r.env.Get("WIREGUARD_INTERFACE", params.Default("wg0")) if err != nil { @@ -71,3 +68,21 @@ func (settings *Wireguard) read(r reader) (err error) { return nil } + +func (settings *Wireguard) readAddresses(env params.Interface) (err error) { + addressStrings, err := env.CSV("WIREGUARD_ADDRESS", params.Compulsory()) + if err != nil { + return fmt.Errorf("environment variable WIREGUARD_ADDRESS: %w", err) + } + + for _, addressString := range addressStrings { + ip, ipNet, err := net.ParseCIDR(addressString) + if err != nil { + return fmt.Errorf("environment variable WIREGUARD_ADDRESS: address %s: %w", addressString, err) + } + ipNet.IP = ip + settings.Addresses = append(settings.Addresses, ipNet) + } + + return nil +} diff --git a/internal/provider/utils/wireguard.go b/internal/provider/utils/wireguard.go index d718dc53..601855bd 100644 --- a/internal/provider/utils/wireguard.go +++ b/internal/provider/utils/wireguard.go @@ -23,12 +23,14 @@ func BuildWireguardSettings(connection models.Connection, copy(settings.Endpoint.IP, connection.IP) settings.Endpoint.Port = int(connection.Port) - address := new(net.IPNet) - address.IP = make(net.IP, len(userSettings.Address.IP)) - copy(address.IP, userSettings.Address.IP) - address.Mask = make(net.IPMask, len(userSettings.Address.Mask)) - copy(address.Mask, userSettings.Address.Mask) - settings.Addresses = append(settings.Addresses, address) + for _, address := range settings.Addresses { + addressCopy := new(net.IPNet) + addressCopy.IP = make(net.IP, len(address.IP)) + copy(addressCopy.IP, address.IP) + addressCopy.Mask = make(net.IPMask, len(address.Mask)) + copy(addressCopy.Mask, address.Mask) + settings.Addresses = append(settings.Addresses, addressCopy) + } return settings }