summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--makefu/3modules/airdcpp.nix170
1 files changed, 131 insertions, 39 deletions
diff --git a/makefu/3modules/airdcpp.nix b/makefu/3modules/airdcpp.nix
index aeb77785e..5250ee67a 100644
--- a/makefu/3modules/airdcpp.nix
+++ b/makefu/3modules/airdcpp.nix
@@ -23,6 +23,12 @@ let
type = str;
default = "airdcpp";
};
+ extraGroups = mkOption {
+ description = ''extra groups for the user (only for default user)'';
+ type = listOf str;
+ default = [];
+ example = [ "nginx" ];
+ };
stateDir = mkOption {
description = ''
@@ -31,50 +37,108 @@ let
type = str;
default = "/var/lib/airdcpp";
};
- web = mkOption {
- type = submodule ( { config, ... }: {
- options = {
- port = mkOption {
- description = ''web-ui port
-
- NOTE: once the initial config had been written to the state directory it will not be replaced
- '';
- type = int;
- default = 5600;
- };
- # TODO: tlsPort
- # TODO: at least one user
- users = mkOption {
- type = attrsOf (submodule ( { config, ... }: {
- options = {
- password = mkOption {
- description = "password of user";
- type = str;
- };
- permissions = mkOption {
- description = "user permissions";
- type = str;
- default = "admin";
- };
- };
- }));
+ dcpp = {
+ Nick = mkOption {
+ description = ''
+ Nick Name for connection
+ '';
+ type = str;
+ default = "kevin";
+ };
+ InPort = mkOption {
+ description = "Input Port";
+ type = int;
+ default = 16849;
+ };
+ UDPPort = mkOption {
+ description = "UDP open Port";
+ type = int;
+ default = 16849;
+ };
+ TLSPort = mkOption {
+ description = "TLS open Port";
+ type = int;
+ default = 16869;
+ };
+ DownloadSpeed = mkOption {
+ description = "Total Download Speed in Mbps/s";
+ type = str;
+ default = "100";
+ };
+ UploadSpeed = mkOption {
+ description = "Total Upload Speed in Mbp/s";
+ type = str;
+ default = "100";
+ };
+ shares = mkOption {
+ default = {};
+ type = attrsOf (submodule ( { config, ... }: {
+ options = {
+ path = mkOption {
+ description = "path to the share";
+ type = str;
+ };
+ incoming = mkOption {
+ description = "incoming";
+ type = bool;
+ default = false;
+ };
};
- };
- });
+ }));
+ };
+ initialConfigFile = mkOption {
+ description = ''
+ path inital DCPlusPlus.xml configuration if none exists
+ '';
+ type = nullOr path;
+ default = null;
+ };
};
- initialConfigFile = mkOption {
- description = ''
- path inital configuration if none exists
- '';
- type = nullOr path;
- default = null;
+ web = {
+ port = mkOption {
+ description = ''web-ui port
+
+ NOTE: once the initial config had been written to the state directory it will not be replaced
+ '';
+ type = int;
+ default = 5600;
+ };
+ initialConfigFile = mkOption {
+ description = ''
+ path inital WebServer.xml configuration if none exists
+ '';
+ type = nullOr path;
+ default = null;
+ };
+ # TODO: tlsPort
+ users = mkOption {
+ type = attrsOf (submodule ( { config, ... }: {
+ options = {
+ password = mkOption {
+ description = "password of user";
+ type = str;
+ };
+ permissions = mkOption {
+ description = "user permissions";
+ type = str;
+ default = "admin";
+ };
+ };
+ }));
+ };
};
};
imp = let
- genUsers = users: concatMapStringsSep "\n" (user: ''<WebUser Username="${user.name}" Password="${user.password}" LastLogin="0" Permissions="${user.permissions}"/>'' )
+ genUsers = users: concatMapStringsSep "\n" (user:
+ ''<WebUser Username="${user.name}" Password="${user.password}" LastLogin="0" Permissions="${user.permissions}"/>'' )
(mapAttrsToList (name: val: val // { inherit name; }) users);
- configFile = if (cfg.initialConfigFile == null) then builtins.trace "warning: airdcpp passwords are stored in plain text" pkgs.writeText "initial-config" ''
+ genShares = shares: concatMapStringsSep "\n" (share:
+ ''<Directory Virtual="stockholm" Incoming="${
+ if share.incoming then "1" else "0"
+ }" LastRefreshTime="0">${share.path}</Directory>'' )
+ (mapAttrsToList (name: val: val // { inherit name; }) shares);
+ webConfigFile = if (cfg.web.initialConfigFile == null) then builtins.trace "warning: airdcpp passwords are stored in plain text" pkgs.writeText "initial-config" ''
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<WebServer>
<Config>
@@ -84,7 +148,32 @@ let
<WebUsers>${genUsers cfg.web.users}
</WebUsers>
</WebServer>
- '' else cfg.initialConfigFile;
+ '' else cfg.web.initialConfigFile;
+ dcppConfigFile = if (cfg.dcpp.initialConfigFile == null) then pkgs.writeText "initial-config" ''
+ <?xml version="1.0" encoding="utf-8" standalone="yes"?>
+ <DCPlusPlus>
+ <Settings>
+ <Nick type="string">${cfg.dcpp.Nick}</Nick>
+ <ConfigVersion type="string">${cfg.package.version}</ConfigVersion>
+ <InPort type="int">${toString cfg.dcpp.InPort}</InPort>
+ <UDPPort type="int">${toString cfg.dcpp.UDPPort}</UDPPort>
+ <TLSPort type="int">${toString cfg.dcpp.TLSPort}</TLSPort>
+ <ConfigBuildNumber type="int">0</ConfigBuildNumber>
+ <AutoDetectIncomingConnection type="int">0</AutoDetectIncomingConnection>
+ <NoIpOverride type="int">1</NoIpOverride>
+ <WizardRunNew type="int">0</WizardRunNew>
+ <IPUpdate type="int">0</IPUpdate>
+ <AlwaysCCPM type="int">1</AlwaysCCPM>
+ <DownloadSpeed type="string">${cfg.dcpp.DownloadSpeed}</DownloadSpeed>
+ <UploadSpeed type="string">${cfg.dcpp.UploadSpeed}</UploadSpeed>
+ </Settings>
+ <Share Token="0" Name="Default">
+ ${genShares cfg.dcpp.shares}
+ <NoShare/>
+ </Share>
+ <ChatFilterItems/>
+ </DCPlusPlus>
+ '' else cfg.dcpp.initialConfigFile;
in {
systemd.services.airdcpp = {
description = "airdcpp webui";
@@ -95,7 +184,9 @@ let
Type = "simple";
ExecStartPre = pkgs.writeDash "prepare-env" ''
d=${cfg.stateDir}/WebServer.xml
- test -e $d || install -m700 -o${cfg.user} ${configFile} $d
+ test -e $d || install -m700 -o${cfg.user} ${webConfigFile} $d
+ d=${cfg.stateDir}/DCPlusPlus.xml
+ test -e $d || install -m700 -o${cfg.user} ${dcppConfigFile} $d
'';
PermissionsStartOnly = true;
ExecStart = "${cfg.package}/bin/airdcppd -c=${cfg.stateDir} -p=${cfg.stateDir}/airdcpp.pid";
@@ -109,6 +200,7 @@ let
uid = genid "airdcpp";
home = cfg.stateDir;
createHome = true;
+ inherit (cfg) extraGroups;
};
groups.airdcpp.gid = genid "airdcpp";
};