anchor.diff:        };
       };
   
  +    networking.extraHosts = cjdnsExtraHosts;
  +
       assertions = [
         { assertion = ( cfg.ETHInterface.bind != "" || cfg.UDPInterface.bind != "" || cfg.confFile != null );
           message = "Neither cjdns.ETHInterface.bind nor cjdns.UDPInterface.bind defined.";
  
positive.code:           '';
           };
          connectTo = mkOption {
            type = types.attrsOf (types.attrsOf types.str);
            default = { };
            example = {
              "192.168.1.1:27313" = {
                user      = "foobar";
                password  = "5kG15EfpdcKNX3f2GSQ0H1HC7yIfxoCoImnO5FHM";
                publicKey = "371zpkgs8ss387tmr81q04mp0hg1skb51hw34vk1cq644mjqhup0.k";
              };
            };
  
negative.code:         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.";
        };
      };
    };
  
    # 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.
  