62 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ lib, pkgs, config, ... }:
 | 
						|
 | 
						|
with lib;
 | 
						|
 | 
						|
let
 | 
						|
  inherit (lib.types) attrsOf coercedTo listOf oneOf str int bool;
 | 
						|
  cfg = config.services.smartdns;
 | 
						|
 | 
						|
  confFile = pkgs.writeText "smartdns.conf" (with generators;
 | 
						|
    toKeyValue {
 | 
						|
      mkKeyValue = mkKeyValueDefault {
 | 
						|
        mkValueString = v:
 | 
						|
          if isBool v then
 | 
						|
            if v then "yes" else "no"
 | 
						|
          else
 | 
						|
            mkValueStringDefault { } v;
 | 
						|
      } " ";
 | 
						|
      listsAsDuplicateKeys =
 | 
						|
        true; # Allowing duplications because we need to deal with multiple entries with the same key.
 | 
						|
    } cfg.settings);
 | 
						|
in {
 | 
						|
  options.services.smartdns = {
 | 
						|
    enable = mkEnableOption "SmartDNS DNS server";
 | 
						|
 | 
						|
    bindPort = mkOption {
 | 
						|
      type = types.port;
 | 
						|
      default = 53;
 | 
						|
      description = "DNS listening port number.";
 | 
						|
    };
 | 
						|
 | 
						|
    settings = mkOption {
 | 
						|
      type =
 | 
						|
      let atom = oneOf [ str int bool ];
 | 
						|
      in attrsOf (coercedTo atom toList (listOf atom));
 | 
						|
      example = literalExample ''
 | 
						|
        {
 | 
						|
          bind = ":5353 -no-rule -group example";
 | 
						|
          cache-size = 4096;
 | 
						|
          server-tls = [ "8.8.8.8:853" "1.1.1.1:853" ];
 | 
						|
          server-https = "https://cloudflare-dns.com/dns-query -exclude-default-group";
 | 
						|
          prefetch-domain = true;
 | 
						|
          speed-check-mode = "ping,tcp:80";
 | 
						|
        };
 | 
						|
      '';
 | 
						|
      description = ''
 | 
						|
        A set that will be generated into configuration file, see the <link xlink:href="https://github.com/pymumu/smartdns/blob/master/ReadMe_en.md#configuration-parameter">SmartDNS README</link> for details of configuration parameters.
 | 
						|
        You could override the options here like <option>services.smartdns.bindPort</option> by writing <literal>settings.bind = ":5353 -no-rule -group example";</literal>.
 | 
						|
      '';
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  config = lib.mkIf cfg.enable {
 | 
						|
    services.smartdns.settings.bind = mkDefault ":${toString cfg.bindPort}";
 | 
						|
 | 
						|
    systemd.packages = [ pkgs.smartdns ];
 | 
						|
    systemd.services.smartdns.wantedBy = [ "multi-user.target" ];
 | 
						|
    environment.etc."smartdns/smartdns.conf".source = confFile;
 | 
						|
    environment.etc."default/smartdns".source =
 | 
						|
      "${pkgs.smartdns}/etc/default/smartdns";
 | 
						|
  };
 | 
						|
}
 |