mirror of
https://github.com/JulienMalka/snowfield.git
synced 2025-03-30 08:40:52 +02:00
feat: add dns module
This commit is contained in:
parent
0ba90fdb2b
commit
1db71f86db
4 changed files with 131 additions and 17 deletions
|
@ -1,7 +1,16 @@
|
||||||
inputs: final: _prev:
|
inputs: final: _prev:
|
||||||
|
|
||||||
with builtins;
|
with builtins;
|
||||||
|
let
|
||||||
|
evalMeta =
|
||||||
|
raw:
|
||||||
|
(_prev.evalModules {
|
||||||
|
modules = [
|
||||||
|
(import ../modules/meta/default.nix)
|
||||||
|
{ machine.meta = raw; }
|
||||||
|
];
|
||||||
|
}).config.machine.meta;
|
||||||
|
in
|
||||||
rec {
|
rec {
|
||||||
importConfig =
|
importConfig =
|
||||||
path:
|
path:
|
||||||
|
@ -37,29 +46,25 @@ rec {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
evalMeta =
|
listToAttrsWithMerge =
|
||||||
raw:
|
l:
|
||||||
(_prev.evalModules {
|
mapAttrs (_: v: _prev.fold (elem: acc: elem.value // acc) { } v) (builtins.groupBy (e: e.name) l);
|
||||||
modules = [
|
|
||||||
(import ../modules/meta/default.nix)
|
mapAttrsWithMerge = f: set: listToAttrsWithMerge (map (attr: f attr set.${attr}) (attrNames set));
|
||||||
{ machine.meta = raw; }
|
|
||||||
];
|
|
||||||
}).config.machine.meta;
|
|
||||||
|
|
||||||
snowfield = mapAttrs (
|
snowfield = mapAttrs (
|
||||||
name: _value:
|
name: _value:
|
||||||
|
let
|
||||||
|
machineF = import (../machines + "/${name}/default.nix");
|
||||||
|
in
|
||||||
evalMeta
|
evalMeta
|
||||||
(import (../machines + "/${name}/default.nix") {
|
(machineF ((mapAttrs (_: _: null) (builtins.functionArgs machineF)) // { inherit inputs; }))
|
||||||
inherit inputs;
|
.machine.meta
|
||||||
config = null;
|
|
||||||
pkgs = null;
|
|
||||||
lib = null;
|
|
||||||
modulesPath = null;
|
|
||||||
}).machine.meta
|
|
||||||
) (final.filterAttrs (_: v: v == "directory") (readDir ../machines));
|
) (final.filterAttrs (_: v: v == "directory") (readDir ../machines));
|
||||||
|
|
||||||
dns = import ./dns.nix {
|
dns = import ./dns.nix {
|
||||||
lib = final;
|
lib = final;
|
||||||
dnsLib = (import inputs.dns).lib;
|
dnsLib = (import inputs.dns).lib;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
{ pkgs, inputs, ... }:
|
{ pkgs, inputs, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
../../users/default.nix
|
../../users/default.nix
|
||||||
../../users/julien.nix
|
../../users/julien.nix
|
||||||
./hardware.nix
|
./hardware.nix
|
||||||
./home-julien.nix
|
./home-julien.nix
|
||||||
|
./nsd.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
machine.meta = {
|
machine.meta = {
|
||||||
|
|
48
machines/gustave/nsd.nix
Normal file
48
machines/gustave/nsd.nix
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
inputs,
|
||||||
|
nixosConfigurations,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
zonesToList = lib.mapAttrsToList (name: value: { ${name} = value; });
|
||||||
|
zonesFromConfig = lib.mkMerge (
|
||||||
|
lib.fold (elem: acc: acc ++ (zonesToList elem.config.machine.meta.zones)) [ ] (
|
||||||
|
lib.attrValues nixosConfigurations
|
||||||
|
)
|
||||||
|
);
|
||||||
|
dnsLib = (import inputs.dns).lib;
|
||||||
|
evalZones =
|
||||||
|
zones:
|
||||||
|
(lib.evalModules {
|
||||||
|
modules = [
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
zones = lib.mkOption {
|
||||||
|
type = lib.types.attrsOf dnsLib.types.zone;
|
||||||
|
description = "DNS zones";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config = {
|
||||||
|
inherit zones;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}).config.zones;
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
services.nsd = {
|
||||||
|
enable = true;
|
||||||
|
interfaces = [
|
||||||
|
config.machine.meta.ips.public.ipv4
|
||||||
|
config.machine.meta.ips.public.ipv6
|
||||||
|
];
|
||||||
|
zones = lib.mapAttrs (_: value: {
|
||||||
|
data = builtins.toString value;
|
||||||
|
provideXFR = [ "192.168.0.0/21 NOKEY" ];
|
||||||
|
}) (evalZones zonesFromConfig);
|
||||||
|
};
|
||||||
|
}
|
61
modules/dns/default.nix
Normal file
61
modules/dns/default.nix
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.machine.meta;
|
||||||
|
allowedDomains = [
|
||||||
|
"luj.fr"
|
||||||
|
"julienmalka.me"
|
||||||
|
"malka.family"
|
||||||
|
"luj"
|
||||||
|
"luj-static.page"
|
||||||
|
];
|
||||||
|
|
||||||
|
isVPNDomain = domain: lib.dns.domainToZone [ "luj" ] domain != null;
|
||||||
|
dnsLib = (import inputs.dns).lib;
|
||||||
|
SOA = {
|
||||||
|
nameServer = "ns";
|
||||||
|
adminEmail = "dns@malka.sh";
|
||||||
|
serial = 0;
|
||||||
|
};
|
||||||
|
defaults = {
|
||||||
|
inherit SOA;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
|
||||||
|
options = {
|
||||||
|
machine.meta.zones = mkOption {
|
||||||
|
type = types.attrsOf dnsLib.types.zone;
|
||||||
|
default = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config =
|
||||||
|
let
|
||||||
|
# list of domains that are defined in the current configuration throught virtualHosts
|
||||||
|
domains = lib.dns.domainsFromConfiguration allowedDomains config;
|
||||||
|
# AttrSet domain -> { records }
|
||||||
|
recordsPerDomain = map (
|
||||||
|
domain:
|
||||||
|
mapAttrs' (
|
||||||
|
n: v:
|
||||||
|
nameValuePair (lib.dns.domainToZone allowedDomains n) (
|
||||||
|
let
|
||||||
|
subdomain = lib.dns.getDomainPrefix allowedDomains n;
|
||||||
|
in
|
||||||
|
(if elem subdomain allowedDomains then v else { subdomains."${subdomain}" = v; }) // defaults
|
||||||
|
)
|
||||||
|
) (lib.dns.domainToRecords domain cfg (isVPNDomain domain))
|
||||||
|
) domains;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
machine.meta.zones = lib.mkMerge recordsPerDomain;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue