summary refs log tree commit diff
path: root/nixos/modules/services
diff options
context:
space:
mode:
authorJoachim Fasting <joachifm@fastmail.fm>2017-01-02 18:48:48 +0100
committerJoachim Fasting <joachifm@fastmail.fm>2017-01-02 19:31:11 +0100
commit237af1853a795356bb8d693c29ad1d319943f94e (patch)
treea342e4a516e7b347d84620d71b156365dee0591a /nixos/modules/services
parent1cc8b830792eb415c97df939776e29cae26fefdf (diff)
downloadnixlib-237af1853a795356bb8d693c29ad1d319943f94e.tar
nixlib-237af1853a795356bb8d693c29ad1d319943f94e.tar.gz
nixlib-237af1853a795356bb8d693c29ad1d319943f94e.tar.bz2
nixlib-237af1853a795356bb8d693c29ad1d319943f94e.tar.lz
nixlib-237af1853a795356bb8d693c29ad1d319943f94e.tar.xz
nixlib-237af1853a795356bb8d693c29ad1d319943f94e.tar.zst
nixlib-237af1853a795356bb8d693c29ad1d319943f94e.zip
Revert "nixos/cjdns: do not ammend /etc/hosts"
This reverts commit 60ded3f3632d221ca3f82a52392e155517880456.

We want to make this optional instead.
Diffstat (limited to 'nixos/modules/services')
-rw-r--r--nixos/modules/services/networking/cjdns.nix51
1 files changed, 31 insertions, 20 deletions
diff --git a/nixos/modules/services/networking/cjdns.nix b/nixos/modules/services/networking/cjdns.nix
index 0dd028997f46..839a5bf07389 100644
--- a/nixos/modules/services/networking/cjdns.nix
+++ b/nixos/modules/services/networking/cjdns.nix
@@ -19,21 +19,30 @@ let
         type = types.str;
         description = "Public key at the opposite end of the tunnel.";
       };
+      hostname = mkOption {
+        default = "";
+        example = "foobar.hype";
+        type = types.str;
+        description = "Optional hostname to add to /etc/hosts; prevents reverse lookup failures.";
+      };
     };
   };
 
-  # check for the required attributes, otherwise
-  # permit attributes not undefined here
-  checkPeers = x:
-    x // {
-      connectTo = mapAttrs
-        (name: value:
-          if !hasAttr "publicKey" value then abort "cjdns peer ${name} missing a publicKey" else
-          if !hasAttr "password"  value then abort "cjdns peer ${name} missing a password"  else
-          value
-        )
-      x.connectTo;
-    };
+  # Additional /etc/hosts entries for peers with an associated hostname
+  cjdnsExtraHosts = import (pkgs.runCommand "cjdns-hosts" {}
+    # Generate a builder that produces an output usable as a Nix string value
+    ''
+      exec >$out
+      echo \'\'
+      ${concatStringsSep "\n" (mapAttrsToList (k: v:
+          optionalString (v.hostname != "")
+            "echo $(${pkgs.cjdns}/bin/publictoip6 ${v.publicKey}) ${v.hostname}")
+          (cfg.ETHInterface.connectTo // cfg.UDPInterface.connectTo))}
+      echo \'\'
+    '');
+
+  parseModules = x:
+    x // { connectTo = mapAttrs (name: value: { inherit (value) password publicKey; }) x.connectTo; };
 
   # would be nice to  merge 'cfg' with a //,
   # but the json nesting is wacky.
@@ -44,8 +53,8 @@ let
     };
     authorizedPasswords = map (p: { password = p; }) cfg.authorizedPasswords;
     interfaces = {
-      ETHInterface = if (cfg.ETHInterface.bind != "") then [ (checkPeers cfg.ETHInterface) ] else [ ];
-      UDPInterface = if (cfg.UDPInterface.bind != "") then [ (checkPeers cfg.UDPInterface) ] else [ ];
+      ETHInterface = if (cfg.ETHInterface.bind != "") then [ (parseModules cfg.ETHInterface) ] else [ ];
+      UDPInterface = if (cfg.UDPInterface.bind != "") then [ (parseModules cfg.UDPInterface) ] else [ ];
     };
 
     privateKey = "@CJDNS_PRIVATE_KEY@";
@@ -125,12 +134,12 @@ in
           '';
          };
         connectTo = mkOption {
-          type = types.attrsOf (types.attrsOf types.str);
+          type = types.attrsOf ( types.submodule ( connectToSubmodule ) );
           default = { };
           example = {
             "192.168.1.1:27313" = {
-              user      = "foobar";
-              password  = "5kG15EfpdcKNX3f2GSQ0H1HC7yIfxoCoImnO5FHM";
+              hostname = "homer.hype";
+              password = "5kG15EfpdcKNX3f2GSQ0H1HC7yIfxoCoImnO5FHM";
               publicKey = "371zpkgs8ss387tmr81q04mp0hg1skb51hw34vk1cq644mjqhup0.k";
             };
           };
@@ -170,12 +179,12 @@ in
         };
 
         connectTo = mkOption {
-          type = types.attrsOf (types.attrsOf types.str);
+          type = types.attrsOf ( types.submodule ( connectToSubmodule ) );
           default = { };
           example = {
             "01:02:03:04:05:06" = {
-              user      = "foobar";
-              password  = "5kG15EfpdcKNX3f2GSQ0H1HC7yIfxoCoImnO5FHM";
+              hostname = "homer.hype";
+              password = "5kG15EfpdcKNX3f2GSQ0H1HC7yIfxoCoImnO5FHM";
               publicKey = "371zpkgs8ss387tmr81q04mp0hg1skb51hw34vk1cq644mjqhup0.k";
             };
           };
@@ -248,6 +257,8 @@ in
       };
     };
 
+    networking.extraHosts = cjdnsExtraHosts;
+
     assertions = [
       { assertion = ( cfg.ETHInterface.bind != "" || cfg.UDPInterface.bind != "" || cfg.confFile != null );
         message = "Neither cjdns.ETHInterface.bind nor cjdns.UDPInterface.bind defined.";