summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormakefu <github@syntax-fehler.de>2018-09-23 22:32:37 +0200
committermakefu <github@syntax-fehler.de>2018-09-23 22:32:37 +0200
commitc7c6b7e504beed811e3d83bda0016412372be670 (patch)
tree08c1e503e37275ffca9a1be2360f4a5e01d3ecba
parent806dd39bd14119f17a954540195e4aa835527e21 (diff)
ma airdcpp module: init
-rw-r--r--makefu/3modules/airdcpp.nix118
-rw-r--r--makefu/5pkgs/airdcpp-webclient/default.nix60
2 files changed, 130 insertions, 48 deletions
diff --git a/makefu/3modules/airdcpp.nix b/makefu/3modules/airdcpp.nix
new file mode 100644
index 00000000..aeb77785
--- /dev/null
+++ b/makefu/3modules/airdcpp.nix
@@ -0,0 +1,118 @@
+{ config, lib, pkgs, ... }:
+with import <stockholm/lib>; #genid
+let
+ cfg = config.makefu.airdcpp;
+
+ out = {
+ options.makefu.airdcpp = api;
+ config = lib.mkIf cfg.enable imp;
+ };
+
+ api = with types;{
+ enable = mkEnableOption "airdcpp";
+
+ package = mkOption {
+ type = package;
+ default = pkgs.airdcpp-webclient;
+ };
+
+ user = mkOption {
+ description = ''
+ user which will run udpt. if kept default a new user will be created
+ '';
+ type = str;
+ default = "airdcpp";
+ };
+
+ stateDir = mkOption {
+ description = ''
+ directory for storing state (pid,config)
+ '';
+ 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";
+ };
+ };
+ }));
+ };
+ };
+ });
+ };
+ initialConfigFile = mkOption {
+ description = ''
+ path inital configuration if none exists
+ '';
+ type = nullOr path;
+ default = null;
+ };
+ };
+
+ imp = let
+ 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" ''
+ <?xml version="1.0" encoding="utf-8" standalone="yes"?>
+ <WebServer>
+ <Config>
+ <Server Port="${toString cfg.web.port}"/>
+ <TLSServer Port="0" Certificate="" CertificateKey=""/>
+ </Config>
+ <WebUsers>${genUsers cfg.web.users}
+ </WebUsers>
+ </WebServer>
+ '' else cfg.initialConfigFile;
+ in {
+ systemd.services.airdcpp = {
+ description = "airdcpp webui";
+ after = [ "network.target" ];
+ wantedBy = [ "multi-user.target" ];
+ restartIfChanged = true;
+ serviceConfig = {
+ Type = "simple";
+ ExecStartPre = pkgs.writeDash "prepare-env" ''
+ d=${cfg.stateDir}/WebServer.xml
+ test -e $d || install -m700 -o${cfg.user} ${configFile} $d
+ '';
+ PermissionsStartOnly = true;
+ ExecStart = "${cfg.package}/bin/airdcppd -c=${cfg.stateDir} -p=${cfg.stateDir}/airdcpp.pid";
+ PrivateTmp = true;
+ WorkingDirectory = cfg.stateDir;
+ User = "${cfg.user}";
+ };
+ };
+ users = lib.mkIf (cfg.user == "airdcpp") {
+ users.airdcpp = {
+ uid = genid "airdcpp";
+ home = cfg.stateDir;
+ createHome = true;
+ };
+ groups.airdcpp.gid = genid "airdcpp";
+ };
+ };
+in
+out
+
diff --git a/makefu/5pkgs/airdcpp-webclient/default.nix b/makefu/5pkgs/airdcpp-webclient/default.nix
index 5e13b234..361a7da6 100644
--- a/makefu/5pkgs/airdcpp-webclient/default.nix
+++ b/makefu/5pkgs/airdcpp-webclient/default.nix
@@ -1,60 +1,24 @@
-{ stdenv, fetchFromGitHub
-, cmake
-, nodejs
-, git
-, miniupnpc
-, boost
-, leveldb
-, openssl
-, geoip
-, libmaxminddb
-, websocketpp
-, libnatpmp
-, tbb
-, bzip2
-, zlib
-, pkgconfig
-, python
+{ stdenv, fetchurl
}:
stdenv.mkDerivation rec {
name = "airdcpp-webclient-${version}";
version = "2.3.0";
-
- src = fetchFromGitHub {
- owner = "airdcpp-web";
- repo = "airdcpp-webclient";
- rev = version;
- sha256 = "1k07ggfw2vq1cs7smykkgkqd8wayamlw1g1mnijjvza4f3zbvihp";
+
+ src = fetchurl {
+ url = http://web-builds.airdcpp.net/stable/airdcpp_2.3.0_webui-2.3.0_64-bit_portable.tar.gz;
+ sha256 = "0yvcl0nc70fghc7vfsgvbpryi5q97arld8adql4way4qa0mdnyv1";
};
- nativeBuildInputs = [ cmake git nodejs pkgconfig python ];
- preConfigure =''
- echo pkgconfig: $PKG_CONFIG_PATH
- # sed -i s/find_package/pkg_search_module/ CMakeLists.txt
+ phases = [ "unpackPhase" "installPhase" ];
+ installPhase = ''
+ mkdir -p $out/{share,bin}
+ cp -r * $out/share
+ ln -s $out/share/airdcppd $out/bin/
'';
- buildInput = [ miniupnpc boost leveldb openssl geoip websocketpp libmaxminddb libnatpmp tbb bzip2 zlib];
- cmakeFlags = [
- "-DLIBMAXMINDDB_ROOT_DIR=${libmaxminddb}"
- "-DBZIP2_INCLUDE_DIR=${bzip2}/include"
- "-DBZIP2_LIBRARIES=${bzip2}/lib"
- "-DZLIB_INCLUDE_DIR=${zlib}/include"
- "-DZLIB_LIBRARY=${zlib}/lib"
- "-DOPENSSL_CRYPTO_LIBRARY=${openssl}/lib"
- "-DOPENSSL_INCLUDE_DIR=${openssl}/include"
- "-DMINIUPNP_LIBRARY=${miniupnpc}/lib"
- "-DMINIUPNP_INCLUDE_DIR=${miniupnpc}/include"
- "-DLevelDB_LIBRARY=${leveldb}/lib"
- "-DLevelDB_INCLUDE_DIR=${leveldb}/include"
- "-DLibNatpmp_INCLUDE_DIR=${libnatpmp}/include"
- "-DLibNatpmp_LIBRARY=${libnatpmp}/lib"
- "-DBoost_INCLUDE_DIR=${boost.dev}/include"
- "-DBoost_LIBRARY=${boost}/lib"
- "-DWebsocketpp_INCLUDE_DIR=${websocketpp}/include"
- "-DWebsocketpp_LIBRARY=${websocketpp}/lib"
- ];
meta = with stdenv.lib; {
- description = "dcpp client";
+ # to start it: airdcpp -p=<pid-file> -c=<config-store-path (must be writeable)> --configure
+ description = "dcpp client (statically precompiled)";
homepage = http://fixme;
license = licenses.gpl3;
maintainers = with maintainers; [ makefu ];