nixpkgs/modules/services/networking/gw6c/default.nix
Mathijs Kwik ce83d3580e gw6c: provide support for all-interfaces
svn path=/nixos/trunk/; revision=32765
2012-03-04 12:58:14 +00:00

167 lines
3.7 KiB
Nix

{ config, pkgs, ... }:
with pkgs.lib;
let
cfg = config.services.gw6c;
gw6cService = pkgs.stdenv.mkDerivation {
name = "gw6c-service";
inherit (pkgs) gw6c coreutils procps upstart iputils gnused gnugrep seccure;
inherit (cfg) username password keepAlive everPing;
gw6server = cfg.server;
authMethod = if cfg.username == "" then "anonymous" else "any";
gw6dir = pkgs.gw6c;
pingBefore = if cfg.waitPingableBroker then "true" else "";
pubkey = config.security.seccureKeys.public;
privkey = config.security.seccureKeys.private;
buildCommand =
''
mkdir -p $out/bin $out/conf
mkdir conf
chmod 0700 conf
touch conf/raw
chmod 0700 conf/raw
substituteAll ${./gw6c.conf} conf/raw
$seccure/bin/seccure-encrypt "$(cat $pubkey)" -i conf/raw -o $out/conf/gw6c.conf
substituteAll ${./control.in} $out/bin/control
chmod a+x $out/bin/control
'';
};
in
{
###### interface
options = {
services.gw6c = {
enable = mkOption {
default = false;
description = "
Whether to enable Gateway6 client (IPv6 tunnel).
";
};
autorun = mkOption {
default = true;
description = "
Switch to false to create upstart-job and configuration,
but not run it automatically
";
};
username = mkOption {
default = "";
description = "
Your Gateway6 login name, if any.
";
};
password = mkOption {
default = "";
description = "
Your Gateway6 password, if any.
";
};
server = mkOption {
default = "anon.freenet6.net";
example = "broker.freenet6.net";
description = "
Used Gateway6 server.
";
};
keepAlive = mkOption {
default = "30";
example = "2";
description = "
Gateway6 keep-alive period.
";
};
everPing = mkOption {
default = "1000000";
example = "2";
description = "
Gateway6 manual ping period.
";
};
waitPingableBroker = mkOption {
default = true;
example = false;
description = "
Whether to wait until tunnel broker returns ICMP echo.
";
};
};
security.seccureKeys = {
# !!! It's not clear to me (ED) what additional security this
# provides. Passwords shouldn't be in configuration.nix,
# period. You could just place the password in
# /var/blah/password or whatever.
public = mkOption {
default = /var/elliptic-keys/public;
description = "
Public key. Make it path argument, so it is copied into store and
hashed.
The key is used to encrypt Gateway 6 configuration in store, as it
contains a password for external service. Unfortunately,
derivation file should be protected by other means. For example,
nix-http-export.cgi will happily export any non-derivation path,
but not a derivation.
";
};
private = mkOption {
default = "/var/elliptic-keys/private";
description = "
Private key. Make it string argument, so it is not copied into store.
";
};
};
};
###### implementation
config = mkIf cfg.enable {
jobs.gw6c =
{ description = "Gateway6 client";
startOn = if cfg.autorun then "started network-interfaces" else "";
stopOn = "stopping network-interfaces";
exec = "${gw6cService}/bin/control start";
};
networking = {
enableIPv6 = true;
interfaceJobs = optional cfg.autorun config.jobs.gw6c;
};
};
}