{ config, lib, ... }: with lib; let cfg = config.roles.wireguard; in { options.roles.wireguard = { enable = mkEnableOption "Enable WireGuard VPN"; interfaceName = mkOption { type = types.str; default = "wg0"; description = "Name of the WireGuard interface"; }; address = mkOption { type = types.listOf types.str; description = "Address(es) for the WireGuard interface"; }; privateKeyFile = mkOption { type = types.path; description = "Path to a root-owned file containing the WireGuard private key"; }; dns = mkOption { type = types.listOf types.str; default = []; description = "DNS servers to use when the tunnel is active"; }; peers = mkOption { type = types.listOf (types.submodule { options = { publicKey = mkOption { type = types.str; description = "Public key of the peer"; }; endpoint = mkOption { type = types.str; description = "Endpoint address of the peer (host:port)"; }; allowedIPs = mkOption { type = types.listOf types.str; description = "List of allowed IP ranges for this peer"; }; persistentKeepalive = mkOption { type = types.int; default = 25; description = "Persistent keepalive interval in seconds"; }; }; }); description = "WireGuard peers"; }; autostart = mkOption { type = types.bool; default = false; description = "Whether to start the VPN automatically on boot"; }; }; config = mkIf cfg.enable { networking.wg-quick.interfaces.${cfg.interfaceName} = { inherit (cfg) address dns autostart peers; privateKeyFile = cfg.privateKeyFile; }; systemd.services."wg-quick-${cfg.interfaceName}" = { after = [ "network-online.target" ]; wants = [ "network-online.target" ]; }; }; }