From a5fa1885462255ec82b61eae3d63b0a058b8305a Mon Sep 17 00:00:00 2001 From: makefu Date: Sun, 23 Sep 2018 22:32:37 +0200 Subject: [PATCH] ma airdcpp module: init --- 3modules/airdcpp.nix | 118 ++++++++++++++++++++++++++++ 5pkgs/airdcpp-webclient/default.nix | 60 +++----------- 2 files changed, 130 insertions(+), 48 deletions(-) create mode 100644 3modules/airdcpp.nix diff --git a/3modules/airdcpp.nix b/3modules/airdcpp.nix new file mode 100644 index 0000000..aeb7778 --- /dev/null +++ b/3modules/airdcpp.nix @@ -0,0 +1,118 @@ +{ config, lib, pkgs, ... }: +with import ; #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: '''' ) + (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" '' + + + + + + + ${genUsers cfg.web.users} + + + '' 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/5pkgs/airdcpp-webclient/default.nix b/5pkgs/airdcpp-webclient/default.nix index 5e13b23..361a7da 100644 --- a/5pkgs/airdcpp-webclient/default.nix +++ b/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= -c= --configure + description = "dcpp client (statically precompiled)"; homepage = http://fixme; license = licenses.gpl3; maintainers = with maintainers; [ makefu ];