My Nix Configuration
1{ pkgs, lib, ... }: 2let 3 script = pkgs.writeShellScriptBin "update-roa" '' 4 mkdir -p /etc/bird/ 5 ${pkgs.curl}/bin/curl -sfSLR {-o,-z}/etc/bird/roa_dn42_v6.conf https://dn42.burble.com/roa/dn42_roa_bird2_6.conf 6 ${pkgs.curl}/bin/curl -sfSLR {-o,-z}/etc/bird/roa_dn42.conf https://dn42.burble.com/roa/dn42_roa_bird2_4.conf 7 ${pkgs.bird2}/bin/birdc c 8 ${pkgs.bird2}/bin/birdc reload in all 9 ''; 10 bgp = import ./bgp.nix { }; 11in 12{ 13 systemd = { 14 timers.dn42-roa = { 15 description = "Trigger a ROA table update"; 16 17 timerConfig = { 18 OnBootSec = "5m"; 19 OnUnitInactiveSec = "1h"; 20 Unit = "dn42-roa.service"; 21 }; 22 23 wantedBy = [ "timers.target" ]; 24 before = [ "bird.service" ]; 25 }; 26 services = { 27 dn42-roa = { 28 after = [ "network.target" ]; 29 description = "DN42 ROA Updated"; 30 unitConfig = { 31 Type = "one-shot"; 32 }; 33 serviceConfig = { 34 ExecStart = "${script}/bin/update-roa"; 35 }; 36 }; 37 }; 38 }; 39 40 services = { 41 bird = { 42 enable = true; 43 package = pkgs.bird2; 44 checkConfig = false; 45 config = 46 builtins.readFile ./bird.conf 47 + lib.concatStrings ( 48 builtins.map ( 49 x: 50 "\n protocol bgp ${x.name} from dnpeers {\n ${ 51 if x.multihop then "multihop;" else "" 52 }\n ${ 53 if x.gracefulRestart then "graceful restart on;" else "" 54 }\n neighbor ${x.neigh} as ${x.as};\n ${ 55 if x.multi || x.v4 then 56 "\n ipv4 {\n extended next hop on;\n import where dn42_import_filter(${x.link},25,34);\n export where dn42_export_filter(${x.link},25,34);\n import keep filtered;\n };\n " 57 else 58 "" 59 }\n ${ 60 if x.multi || x.v6 then 61 "\n ipv6 {\n extended next hop on;\n import where dn42_import_filter(${x.link},25,34);\n export where dn42_export_filter(${x.link},25,34);\n import keep filtered;\n };\n " 62 else 63 "" 64 }\n }\n " 65 ) bgp.sessions 66 ) 67 + bgp.extraConfig; 68 }; 69 }; 70 users.users.thehedgehog.extraGroups = [ "bird2" ]; 71}