89 lines
2.3 KiB
Go
89 lines
2.3 KiB
Go
package configuration
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
|
|
"github.com/qdm12/golibs/params"
|
|
)
|
|
|
|
// Wireguard contains settings to configure the Wireguard client.
|
|
type Wireguard struct {
|
|
PrivateKey string `json:"privatekey"`
|
|
PreSharedKey string `json:"presharedkey"`
|
|
Addresses []*net.IPNet `json:"addresses"`
|
|
Interface string `json:"interface"`
|
|
}
|
|
|
|
func (settings *Wireguard) String() string {
|
|
return strings.Join(settings.lines(), "\n")
|
|
}
|
|
|
|
func (settings *Wireguard) lines() (lines []string) {
|
|
lines = append(lines, lastIndent+"Wireguard:")
|
|
|
|
lines = append(lines, indent+lastIndent+"Network interface: "+settings.Interface)
|
|
|
|
if settings.PrivateKey != "" {
|
|
lines = append(lines, indent+lastIndent+"Private key is set")
|
|
}
|
|
|
|
if settings.PreSharedKey != "" {
|
|
lines = append(lines, indent+lastIndent+"Pre-shared key is set")
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
func (settings *Wireguard) read(r reader) (err error) {
|
|
settings.PrivateKey, err = r.env.Get("WIREGUARD_PRIVATE_KEY",
|
|
params.CaseSensitiveValue(), params.Unset(), params.Compulsory())
|
|
if err != nil {
|
|
return fmt.Errorf("environment variable WIREGUARD_PRIVATE_KEY: %w", err)
|
|
}
|
|
|
|
settings.PreSharedKey, err = r.env.Get("WIREGUARD_PRESHARED_KEY",
|
|
params.CaseSensitiveValue(), params.Unset())
|
|
if err != nil {
|
|
return fmt.Errorf("environment variable WIREGUARD_PRESHARED_KEY: %w", err)
|
|
}
|
|
|
|
err = settings.readAddresses(r.env)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
settings.Interface, err = r.env.Get("WIREGUARD_INTERFACE", params.Default("wg0"))
|
|
if err != nil {
|
|
return fmt.Errorf("environment variable WIREGUARD_INTERFACE: %w", err)
|
|
}
|
|
|
|
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
|
|
}
|