Feat: support csv addresses in WIREGUARD_ADDRESS

This commit is contained in:
Quentin McGaw (desktop)
2021-08-28 18:43:23 +00:00
parent da525e039d
commit c6fedd9214
2 changed files with 37 additions and 20 deletions

View File

@@ -10,10 +10,10 @@ import (
// Wireguard contains settings to configure the Wireguard client. // Wireguard contains settings to configure the Wireguard client.
type Wireguard struct { type Wireguard struct {
PrivateKey string `json:"privatekey"` PrivateKey string `json:"privatekey"`
PreSharedKey string `json:"presharedkey"` PreSharedKey string `json:"presharedkey"`
Address *net.IPNet `json:"address"` Addresses []*net.IPNet `json:"addresses"`
Interface string `json:"interface"` Interface string `json:"interface"`
} }
func (settings *Wireguard) String() string { 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") lines = append(lines, indent+lastIndent+"Pre-shared key is set")
} }
if settings.Address != nil { if len(settings.Addresses) > 0 {
lines = append(lines, indent+lastIndent+"Address: "+settings.Address.String()) lines = append(lines, indent+lastIndent+"Addresses: ")
for _, address := range settings.Addresses {
lines = append(lines, indent+indent+lastIndent+address.String())
}
} }
return lines return lines
@@ -53,16 +56,10 @@ func (settings *Wireguard) read(r reader) (err error) {
return fmt.Errorf("environment variable WIREGUARD_PRESHARED_KEY: %w", err) 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 { 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")) settings.Interface, err = r.env.Get("WIREGUARD_INTERFACE", params.Default("wg0"))
if err != nil { if err != nil {
@@ -71,3 +68,21 @@ func (settings *Wireguard) read(r reader) (err error) {
return nil 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
}

View File

@@ -23,12 +23,14 @@ func BuildWireguardSettings(connection models.Connection,
copy(settings.Endpoint.IP, connection.IP) copy(settings.Endpoint.IP, connection.IP)
settings.Endpoint.Port = int(connection.Port) settings.Endpoint.Port = int(connection.Port)
address := new(net.IPNet) for _, address := range settings.Addresses {
address.IP = make(net.IP, len(userSettings.Address.IP)) addressCopy := new(net.IPNet)
copy(address.IP, userSettings.Address.IP) addressCopy.IP = make(net.IP, len(address.IP))
address.Mask = make(net.IPMask, len(userSettings.Address.Mask)) copy(addressCopy.IP, address.IP)
copy(address.Mask, userSettings.Address.Mask) addressCopy.Mask = make(net.IPMask, len(address.Mask))
settings.Addresses = append(settings.Addresses, address) copy(addressCopy.Mask, address.Mask)
settings.Addresses = append(settings.Addresses, addressCopy)
}
return settings return settings
} }