nixos/estuary: Add Lua file-based DNS records
This commit is contained in:
		| @@ -10,6 +10,58 @@ let | ||||
|   reverseZone6 = "b.b.b.0.d.4.0.0.c.7.9.e.0.a.2.ip6.arpa"; | ||||
|  | ||||
|   authZones = attrNames config.my.pdns.auth.bind.zones; | ||||
|  | ||||
|   pdns-file-record = pkgs.writeShellApplication { | ||||
|     name = "pdns-file-record"; | ||||
|     runtimeInputs = [ pkgs.gnused ]; | ||||
|     text = '' | ||||
|       die() { | ||||
|         echo "$@" >&2 | ||||
|         exit 1 | ||||
|       } | ||||
|       usage() { | ||||
|         die "usage: $0 <add|del> <fqdn> [content]" | ||||
|       } | ||||
|  | ||||
|       add() { | ||||
|         if [ $# -ne 2 ]; then | ||||
|           usage | ||||
|         fi | ||||
|  | ||||
|         echo "$2" >> "$dir"/"$1"txt | ||||
|       } | ||||
|       del() { | ||||
|         if [ $# -lt 1 ]; then | ||||
|           usage | ||||
|         fi | ||||
|  | ||||
|         file="$dir"/"$1"txt | ||||
|         if [ $# -eq 1 ]; then | ||||
|           rm "$file" | ||||
|         else | ||||
|           sed -i "/^""$2""$/!{q1}; /^""$2""$/d" "$file" | ||||
|           exit $? | ||||
|         fi | ||||
|       } | ||||
|  | ||||
|       dir=/run/pdns/file-records | ||||
|       mkdir -p "$dir" | ||||
|  | ||||
|       if [ $# -lt 1 ]; then | ||||
|         usage | ||||
|       fi | ||||
|       cmd="$1" | ||||
|       shift | ||||
|       case "$cmd" in | ||||
|       add) | ||||
|         add "$@";; | ||||
|       del) | ||||
|         del "$@";; | ||||
|       *) | ||||
|         usage;; | ||||
|       esac | ||||
|     ''; | ||||
|   }; | ||||
| in | ||||
| { | ||||
|   config = { | ||||
| @@ -38,6 +90,7 @@ in | ||||
|     # For rec_control | ||||
|     environment.systemPackages = with pkgs; [ | ||||
|       pdns-recursor | ||||
|       pdns-file-record | ||||
|     ]; | ||||
|  | ||||
|     my.pdns.auth = { | ||||
| @@ -109,6 +162,20 @@ in | ||||
|         wildcardPtr6' = n: root: ''*.${wildcardPtr6Zeroes n}${root} ${wildcardPtr6Def}''; | ||||
|         wildcardPtr6 = n: root: concatStringsSep "\n" (genList (i: wildcardPtr6' i root) (n - 1)); | ||||
|         wildcardPtr6Z = wildcardPtr6 ptrDots6; | ||||
|  | ||||
|         fileRecScript = pkgs.writeText "file-record.lua" '' | ||||
|           local path = "/run/pdns/file-records/" .. qname:toStringNoDot() .. ".txt" | ||||
|           if not os.execute("test -e " .. path) then | ||||
|             return {} | ||||
|           end | ||||
|  | ||||
|           local values = {} | ||||
|           for line in io.lines(path) do | ||||
|             table.insert(values, line) | ||||
|           end | ||||
|           return values | ||||
|         ''; | ||||
|         fileRecVal = ''"dofile('${fileRecScript}')"''; | ||||
|       in | ||||
|       { | ||||
|         "${config.networking.domain}" = { | ||||
| @@ -128,6 +195,8 @@ in | ||||
|  | ||||
|             @ IN ALIAS ${config.networking.fqdn}. | ||||
|  | ||||
|             _acme-challenge IN LUA TXT ${fileRecVal} | ||||
|  | ||||
|             ${intRecords} | ||||
|           ''; | ||||
|         }; | ||||
| @@ -171,7 +240,7 @@ in | ||||
|             ${intPtr6Records} | ||||
|  | ||||
|             * ${wildcardPtr6Def} | ||||
|             ; Have to add a specific wildard for each of the explicitly set subnets... this is disgusting for IPv6 | ||||
|             ; Have to add a specific wildcard for each of the explicitly set subnets... this is disgusting for IPv6 | ||||
|             ${wildcardPtr6Z "0"} | ||||
|             ${wildcardPtr6Z "1"} | ||||
|             ${wildcardPtr6Z "2"} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user