Skip to content
Snippets Groups Projects
Select Git revision
  • main
1 result

config.go

Blame
  • config.go 1.69 KiB
    package config
    
    import (
    	"fmt"
    	"git.kuschku.de/justjanne/terraform-provider-mullvad/api"
    	"net/netip"
    )
    
    type Result struct {
    	Config string
    	Peer   []string
    }
    
    func GenerateConfig(c *MullvadContext, serverHostname string, privateKey api.WireguardKey) (Result, error) {
    	servers, err := c.Client.ListServers()
    	if err != nil {
    		return Result{}, fmt.Errorf("could not load server list: %w", err)
    	}
    	server, err := servers.Wireguard.FindServer(serverHostname)
    	if err != nil {
    		return Result{}, fmt.Errorf("could not find server: %w", err)
    	}
    	endpoints, err := c.Client.GetEndpoints(c.AccountId, privateKey.PublicKey())
    	if err != nil {
    		return Result{}, fmt.Errorf("could not get wireguard endpoints: %w", err)
    	}
    	port, err := findPort(servers.Wireguard.PortRanges)
    	if err != nil {
    		return Result{}, fmt.Errorf("could not find suitable port for wireguard endpoint: %w", err)
    	}
    
    	wireguardConfig, err := templateConfig(configData{
    		InterfacePrivateKey: privateKey,
    		InterfaceAddress:    endpoints,
    		InterfaceGateways: []netip.Addr{
    			servers.Wireguard.IPv4Gateway,
    			servers.Wireguard.IPv6Gateway,
    		},
    		PeerPublicKey: server.PublicKey,
    		PeerEndpoint:  netip.AddrPortFrom(server.IPv4Endpoint, port),
    	})
    	if err != nil {
    		return Result{}, fmt.Errorf("could not generate wireguard config: %w", err)
    	}
    
    	return Result{
    		Config: wireguardConfig,
    		Peer: []string{
    			server.IPv4Endpoint.String(),
    		},
    	}, nil
    }
    
    func findPort(portRanges [][]uint16) (uint16, error) {
    	if portRanges == nil || len(portRanges) == 0 {
    		return 0, fmt.Errorf("no port available")
    	}
    	for _, portRange := range portRanges {
    		if len(portRange) == 2 {
    			return portRange[0], nil
    		}
    	}
    	return 0, fmt.Errorf("no port available")
    }