ma airdcpp module: pre-configure shares

This commit is contained in:
makefu 2018-09-24 00:36:56 +02:00
parent c7c6b7e504
commit 1996b59748
No known key found for this signature in database
GPG key ID: 36F7711F3FC0F225

View file

@ -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";
}; };