nixos/home/routing-common: Dynamically return WAN IP DNS
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				CI / Check, build and cache Nix flake (push) Successful in 17m8s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	CI / Check, build and cache Nix flake (push) Successful in 17m8s
				
			This commit is contained in:
		@@ -8,6 +8,18 @@ let
 | 
			
		||||
  inherit (lib.flake) defaultSystems;
 | 
			
		||||
in
 | 
			
		||||
rec {
 | 
			
		||||
  pow =
 | 
			
		||||
    let
 | 
			
		||||
      pow' = base: exponent: value:
 | 
			
		||||
        # FIXME: It will silently overflow on values > 2**62 :(
 | 
			
		||||
        # The value will become negative or zero in this case
 | 
			
		||||
        if exponent == 0
 | 
			
		||||
        then 1
 | 
			
		||||
        else if exponent <= 1
 | 
			
		||||
        then value
 | 
			
		||||
        else (pow' base (exponent - 1) (value * base));
 | 
			
		||||
    in base: exponent: pow' base exponent base;
 | 
			
		||||
 | 
			
		||||
  attrsToNVList = mapAttrsToList nameValuePair;
 | 
			
		||||
 | 
			
		||||
  inherit (import ./net.nix { inherit lib; }) net;
 | 
			
		||||
@@ -29,6 +41,8 @@ rec {
 | 
			
		||||
      ports = checked (elemAt m 1);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  netBroadcast = net': net.cidr.host ((pow 2 (net.cidr.size net')) - 1) net';
 | 
			
		||||
 | 
			
		||||
  mkDefaultSystemsPkgs = path: args': genAttrs defaultSystems (system: import path ((args' system) // { inherit system; }));
 | 
			
		||||
  mkApp = program: { type = "app"; inherit program; };
 | 
			
		||||
  mkShellApp = pkgs: name: text: mkApp (pkgs.writeShellScript name text).outPath;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										31
									
								
								lib/dns.nix
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								lib/dns.nix
									
									
									
									
									
								
							@@ -67,4 +67,35 @@ rec {
 | 
			
		||||
          (a.ipv6.address != null && a.ipv6.genPTR)
 | 
			
		||||
          ''@@PTR:${a.ipv6.address}:${toString ndots}@@ IN PTR ${a.name}.${domain}.'';
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  ifaceA = { pkgs, iface, skipBroadcasts ? [] }:
 | 
			
		||||
  let
 | 
			
		||||
    extraFilters = concatMapStringsSep " " (b: ''and .broadcast != \"${b}\"'') skipBroadcasts;
 | 
			
		||||
    script = pkgs.writeText "if-${iface}-a.lua" ''
 | 
			
		||||
      local proc = io.popen("${pkgs.iproute2}/bin/ip -j addr show dev ${iface} | ${pkgs.jq}/bin/jq -r '.[0].addr_info[] | select(.family == \"inet\" and .scope == \"global\" ${extraFilters}).local'", "r")
 | 
			
		||||
      assert(proc, "failed to popen")
 | 
			
		||||
 | 
			
		||||
      local addr_line = proc:read("*l")
 | 
			
		||||
      assert(proc:close(), "command failed")
 | 
			
		||||
      assert(addr_line, "no output from command")
 | 
			
		||||
 | 
			
		||||
      return addr_line
 | 
			
		||||
    '';
 | 
			
		||||
  in
 | 
			
		||||
    ''A "dofile('${script}')"'';
 | 
			
		||||
 | 
			
		||||
  lookupIP = { pkgs, hostname, server, type ? "A" }:
 | 
			
		||||
  let
 | 
			
		||||
    script = pkgs.writeScript "drill-${hostname}-${server}.lua" ''
 | 
			
		||||
      local proc = io.popen("${pkgs.ldns}/bin/drill -Q @${server} ${hostname} ${type}", "r")
 | 
			
		||||
      assert(proc, "failed to popen")
 | 
			
		||||
 | 
			
		||||
      local addr_line = proc:read("*l")
 | 
			
		||||
      assert(proc:close(), "command failed")
 | 
			
		||||
      assert(addr_line, "no output from command")
 | 
			
		||||
 | 
			
		||||
      return addr_line
 | 
			
		||||
    '';
 | 
			
		||||
  in
 | 
			
		||||
    ''${type} "dofile('${script}')"'';
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user