summary refs log tree commit diff
path: root/nixos/modules/services/networking
diff options
context:
space:
mode:
authorRickard Nilsson <rickynils@gmail.com>2013-11-13 01:52:57 +0100
committerRickard Nilsson <rickynils@gmail.com>2013-11-13 01:52:57 +0100
commit26d7598d464127157d3ca49d9c71561d70f1d209 (patch)
tree695801988d7855cf6dd3e423a0a3f67440df1e75 /nixos/modules/services/networking
parentf923c3220485b057cacbabb3396ba42d1dbb2b97 (diff)
downloadnixlib-26d7598d464127157d3ca49d9c71561d70f1d209.tar
nixlib-26d7598d464127157d3ca49d9c71561d70f1d209.tar.gz
nixlib-26d7598d464127157d3ca49d9c71561d70f1d209.tar.bz2
nixlib-26d7598d464127157d3ca49d9c71561d70f1d209.tar.lz
nixlib-26d7598d464127157d3ca49d9c71561d70f1d209.tar.xz
nixlib-26d7598d464127157d3ca49d9c71561d70f1d209.tar.zst
nixlib-26d7598d464127157d3ca49d9c71561d70f1d209.zip
networkmanager NixOS service: Make it possible to append or insert name servers in /etc/resolv.conf
Diffstat (limited to 'nixos/modules/services/networking')
-rw-r--r--nixos/modules/services/networking/networkmanager.nix42
1 files changed, 22 insertions, 20 deletions
diff --git a/nixos/modules/services/networking/networkmanager.nix b/nixos/modules/services/networking/networkmanager.nix
index 2e8d17d872d2..62bf38e4e708 100644
--- a/nixos/modules/services/networking/networkmanager.nix
+++ b/nixos/modules/services/networking/networkmanager.nix
@@ -55,15 +55,19 @@ let
     fi
   '';
 
+  ns = xs: writeText "nameservers" (
+    concatStrings (map (s: "nameserver ${s}\n") xs)
+  );
+
   overrideNameserversScript = writeScript "02overridedns" ''
     #!/bin/sh
-    ${optionalString cfg.overrideNameservers "${gnused}/bin/sed -i '/nameserver /d' /etc/resolv.conf"}
-    ${concatStrings (map (s: ''
-      ${optionalString cfg.appendNameservers
-        "${gnused}/bin/sed -i '/nameserver ${s}/d' /etc/resolv.conf"
-      }
-      echo 'nameserver ${s}' >> /etc/resolv.conf
-    '') config.networking.nameservers)}
+    tmp=`${coreutils}/bin/mktemp`
+    ${gnused}/bin/sed '/nameserver /d' /etc/resolv.conf > $tmp
+    ${gnugrep}/bin/grep 'nameserver ' /etc/resolv.conf | \
+      ${gnugrep}/bin/grep -vf ${ns (cfg.appendNameservers ++ cfg.insertNameservers)} > $tmp.ns
+    ${optionalString (cfg.appendNameservers != []) "${coreutils}/bin/cat $tmp $tmp.ns ${ns cfg.appendNameservers} > /etc/resolv.conf"}
+    ${optionalString (cfg.insertNameservers != []) "${coreutils}/bin/cat $tmp ${ns cfg.insertNameservers} $tmp.ns > /etc/resolv.conf"}
+    ${coreutils}/bin/rm -f $tmp $tmp.ns
   '';
 
 in {
@@ -95,23 +99,21 @@ in {
         apply = list: [ networkmanager modemmanager wpa_supplicant ] ++ list;
       };
 
-      overrideNameservers = mkOption {
-        default = false;
+      appendNameservers = mkOption {
+        type = types.listOf types.string;
+        default = [];
         description = ''
-          If enabled, any nameservers received by DHCP or configured in
-          NetworkManager will be replaced by the nameservers configured
-          in the <literal>networking.nameservers</literal> option. This
-          option overrides the <literal>appendNameservers</literal> option
-          if both are enabled.
+          A list of name servers that should be appended
+          to the ones configured in NetworkManager or received by DHCP.
         '';
       };
 
-      appendNameservers = mkOption {
-        default = false;
+      insertNameservers = mkOption {
+        type = types.listOf types.string;
+        default = [];
         description = ''
-          If enabled, the name servers configured in the
-          <literal>networking.nameservers</literal> option will be appended
-          to the ones configured in NetworkManager or received by DHCP.
+          A list of name servers that should be inserted before
+          the ones configured in NetworkManager or received by DHCP.
         '';
       };
 
@@ -144,7 +146,7 @@ in {
       { source = "${networkmanager_openconnect}/etc/NetworkManager/VPN/nm-openconnect-service.name";
         target = "NetworkManager/VPN/nm-openconnect-service.name";
       }
-    ] ++ pkgs.lib.optional (cfg.overrideNameservers || cfg.appendNameservers)
+    ] ++ pkgs.lib.optional (cfg.appendNameservers == [] || cfg.insertNameservers == [])
            { source = overrideNameserversScript;
              target = "NetworkManager/dispatcher.d/02overridedns";
            };