ma airdcpp module: pre-configure shares
This commit is contained in:
parent
c7c6b7e504
commit
1996b59748
|
@ -23,6 +23,12 @@ let
|
||||||
type = str;
|
type = str;
|
||||||
default = "airdcpp";
|
default = "airdcpp";
|
||||||
};
|
};
|
||||||
|
extraGroups = mkOption {
|
||||||
|
description = ''extra groups for the user (only for default user)'';
|
||||||
|
type = listOf str;
|
||||||
|
default = [];
|
||||||
|
example = [ "nginx" ];
|
||||||
|
};
|
||||||
|
|
||||||
stateDir = mkOption {
|
stateDir = mkOption {
|
||||||
description = ''
|
description = ''
|
||||||
|
@ -31,50 +37,108 @@ let
|
||||||
type = str;
|
type = str;
|
||||||
default = "/var/lib/airdcpp";
|
default = "/var/lib/airdcpp";
|
||||||
};
|
};
|
||||||
web = mkOption {
|
dcpp = {
|
||||||
type = submodule ( { config, ... }: {
|
Nick = mkOption {
|
||||||
options = {
|
description = ''
|
||||||
port = mkOption {
|
Nick Name for connection
|
||||||
description = ''web-ui port
|
'';
|
||||||
|
type = str;
|
||||||
NOTE: once the initial config had been written to the state directory it will not be replaced
|
default = "kevin";
|
||||||
'';
|
};
|
||||||
type = int;
|
InPort = mkOption {
|
||||||
default = 5600;
|
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;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
# TODO: tlsPort
|
}));
|
||||||
# TODO: at least one user
|
};
|
||||||
users = mkOption {
|
initialConfigFile = mkOption {
|
||||||
type = attrsOf (submodule ( { config, ... }: {
|
description = ''
|
||||||
options = {
|
path inital DCPlusPlus.xml configuration if none exists
|
||||||
password = mkOption {
|
'';
|
||||||
description = "password of user";
|
type = nullOr path;
|
||||||
type = str;
|
default = null;
|
||||||
};
|
};
|
||||||
permissions = mkOption {
|
|
||||||
description = "user permissions";
|
|
||||||
type = str;
|
|
||||||
default = "admin";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
};
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
initialConfigFile = mkOption {
|
web = {
|
||||||
description = ''
|
port = mkOption {
|
||||||
path inital configuration if none exists
|
description = ''web-ui port
|
||||||
'';
|
|
||||||
type = nullOr path;
|
NOTE: once the initial config had been written to the state directory it will not be replaced
|
||||||
default = null;
|
'';
|
||||||
|
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
|
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);
|
(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"?>
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
<WebServer>
|
<WebServer>
|
||||||
<Config>
|
<Config>
|
||||||
|
@ -84,7 +148,32 @@ let
|
||||||
<WebUsers>${genUsers cfg.web.users}
|
<WebUsers>${genUsers cfg.web.users}
|
||||||
</WebUsers>
|
</WebUsers>
|
||||||
</WebServer>
|
</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 {
|
in {
|
||||||
systemd.services.airdcpp = {
|
systemd.services.airdcpp = {
|
||||||
description = "airdcpp webui";
|
description = "airdcpp webui";
|
||||||
|
@ -95,7 +184,9 @@ let
|
||||||
Type = "simple";
|
Type = "simple";
|
||||||
ExecStartPre = pkgs.writeDash "prepare-env" ''
|
ExecStartPre = pkgs.writeDash "prepare-env" ''
|
||||||
d=${cfg.stateDir}/WebServer.xml
|
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;
|
PermissionsStartOnly = true;
|
||||||
ExecStart = "${cfg.package}/bin/airdcppd -c=${cfg.stateDir} -p=${cfg.stateDir}/airdcpp.pid";
|
ExecStart = "${cfg.package}/bin/airdcppd -c=${cfg.stateDir} -p=${cfg.stateDir}/airdcpp.pid";
|
||||||
|
@ -109,6 +200,7 @@ let
|
||||||
uid = genid "airdcpp";
|
uid = genid "airdcpp";
|
||||||
home = cfg.stateDir;
|
home = cfg.stateDir;
|
||||||
createHome = true;
|
createHome = true;
|
||||||
|
inherit (cfg) extraGroups;
|
||||||
};
|
};
|
||||||
groups.airdcpp.gid = genid "airdcpp";
|
groups.airdcpp.gid = genid "airdcpp";
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue