anchor.diff:          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; };
  +  # 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;
  +    };
   
     # would be nice to  merge 'cfg' with a //,
     # but the json nesting is wacky.
  
positive.code:       };
      };
  
      networking.extraHosts = cjdnsExtraHosts;
  
      assertions = [
        { assertion = ( cfg.ETHInterface.bind != "" || cfg.UDPInterface.bind != "" || cfg.confFile != null );
          message = "Neither cjdns.ETHInterface.bind nor cjdns.UDPInterface.bind defined.";
  
negative.code:         };
  
          connectTo = mkOption {
            type = types.attrsOf (types.attrsOf types.str);
            default = { };
            example = {
              "01:02:03:04:05:06" = {
                user      = "foobar";
                password  = "5kG15EfpdcKNX3f2GSQ0H1HC7yIfxoCoImnO5FHM";
                publicKey = "371zpkgs8ss387tmr81q04mp0hg1skb51hw34vk1cq644mjqhup0.k";
              };
            };
  