ma airdcpp module: pre-configure shares
This commit is contained in:
parent
c7c6b7e504
commit
1996b59748
@ -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;
|
||||
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;
|
||||
};
|
||||
};
|
||||
# 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";
|
||||
};
|
||||
};
|
||||
}));
|
||||
};
|
||||
};
|
||||
});
|
||||
}));
|
||||
};
|
||||
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";
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user