29027fd1e1
Using pkgs.lib on the spine of module evaluation is problematic because the pkgs argument depends on the result of module evaluation. To prevent an infinite recursion, pkgs and some of the modules are evaluated twice, which is inefficient. Using ‘with lib’ prevents this problem.
149 lines
3.3 KiB
Nix
149 lines
3.3 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
|
|
cfg = config.services.gnunet;
|
|
|
|
homeDir = "/var/lib/gnunet";
|
|
|
|
configFile = with cfg; pkgs.writeText "gnunetd.conf"
|
|
''
|
|
[PATHS]
|
|
SERVICEHOME = ${homeDir}
|
|
|
|
[ats]
|
|
WAN_QUOTA_IN = ${toString load.maxNetDownBandwidth} b
|
|
WAN_QUOTA_OUT = ${toString load.maxNetUpBandwidth} b
|
|
|
|
[datastore]
|
|
QUOTA = ${toString fileSharing.quota} MB
|
|
|
|
[transport-udp]
|
|
PORT = ${toString udp.port}
|
|
ADVERTISED_PORT = ${toString udp.port}
|
|
|
|
[transport-tcp]
|
|
PORT = ${toString tcp.port}
|
|
ADVERTISED_PORT = ${toString tcp.port}
|
|
|
|
${extraOptions}
|
|
'';
|
|
|
|
in
|
|
|
|
{
|
|
|
|
###### interface
|
|
|
|
options = {
|
|
|
|
services.gnunet = {
|
|
|
|
enable = mkOption {
|
|
default = false;
|
|
description = ''
|
|
Whether to run the GNUnet daemon. GNUnet is GNU's anonymous
|
|
peer-to-peer communication and file sharing framework.
|
|
'';
|
|
};
|
|
|
|
fileSharing = {
|
|
quota = mkOption {
|
|
default = 1024;
|
|
description = ''
|
|
Maximum file system usage (in MiB) for file sharing.
|
|
'';
|
|
};
|
|
};
|
|
|
|
udp = {
|
|
port = mkOption {
|
|
default = 2086; # assigned by IANA
|
|
description = ''
|
|
The UDP port for use by GNUnet.
|
|
'';
|
|
};
|
|
};
|
|
|
|
tcp = {
|
|
port = mkOption {
|
|
default = 2086; # assigned by IANA
|
|
description = ''
|
|
The TCP port for use by GNUnet.
|
|
'';
|
|
};
|
|
};
|
|
|
|
load = {
|
|
maxNetDownBandwidth = mkOption {
|
|
default = 50000;
|
|
description = ''
|
|
Maximum bandwidth usage (in bits per second) for GNUnet
|
|
when downloading data.
|
|
'';
|
|
};
|
|
|
|
maxNetUpBandwidth = mkOption {
|
|
default = 50000;
|
|
description = ''
|
|
Maximum bandwidth usage (in bits per second) for GNUnet
|
|
when downloading data.
|
|
'';
|
|
};
|
|
|
|
hardNetUpBandwidth = mkOption {
|
|
default = 0;
|
|
description = ''
|
|
Hard bandwidth limit (in bits per second) when uploading
|
|
data.
|
|
'';
|
|
};
|
|
};
|
|
|
|
extraOptions = mkOption {
|
|
default = "";
|
|
description = ''
|
|
Additional options that will be copied verbatim in `gnunet.conf'.
|
|
See `gnunet.conf(5)' for details.
|
|
'';
|
|
};
|
|
};
|
|
|
|
};
|
|
|
|
|
|
###### implementation
|
|
|
|
config = mkIf config.services.gnunet.enable {
|
|
|
|
users.extraUsers.gnunet = {
|
|
group = "gnunet";
|
|
description = "GNUnet User";
|
|
home = homeDir;
|
|
createHome = true;
|
|
uid = config.ids.uids.gnunet;
|
|
};
|
|
|
|
users.extraGroups.gnunet.gid = config.ids.gids.gnunet;
|
|
|
|
# The user tools that talk to `gnunetd' should come from the same source,
|
|
# so install them globally.
|
|
environment.systemPackages = [ pkgs.gnunet ];
|
|
|
|
systemd.services.gnunet = {
|
|
description = "GNUnet";
|
|
after = [ "network.target" ];
|
|
wantedBy = [ "multi-user.target" ];
|
|
path = [ pkgs.gnunet pkgs.miniupnpc ];
|
|
serviceConfig.ExecStart = "${pkgs.gnunet}/lib/gnunet/libexec/gnunet-service-arm -c ${configFile}";
|
|
serviceConfig.User = "gnunet";
|
|
serviceConfig.UMask = "0007";
|
|
serviceConfig.WorkingDirectory = homeDir;
|
|
};
|
|
|
|
};
|
|
|
|
}
|