From 08f1686dd30e5cace0713158e87d2c4bad27bddf Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Thu, 18 Aug 2016 16:39:28 +0200
Subject: [PATCH] m 3 deluge: init module

---
 makefu/3modules/default.nix |   1 +
 makefu/3modules/deluge.nix  | 182 ++++++++++++++++++++++++++++++++++++
 2 files changed, 183 insertions(+)
 create mode 100644 makefu/3modules/deluge.nix

diff --git a/makefu/3modules/default.nix b/makefu/3modules/default.nix
index 7fc095bab..bdba4ae46 100644
--- a/makefu/3modules/default.nix
+++ b/makefu/3modules/default.nix
@@ -8,6 +8,7 @@ _:
     ./snapraid.nix
     ./taskserver.nix
     ./umts.nix
+    ./deluge.nix
   ];
 }
 
diff --git a/makefu/3modules/deluge.nix b/makefu/3modules/deluge.nix
new file mode 100644
index 000000000..8097885b1
--- /dev/null
+++ b/makefu/3modules/deluge.nix
@@ -0,0 +1,182 @@
+{ config, lib, pkgs, ... }:
+# based on <nixpkgs>/nixos/modules/services/torrent/deluge.nix
+with config.krebs.lib;
+
+let
+  cfg_daemon = config.makefu.deluge;
+  homedir = cfg_daemon.homedir;
+  cfg_web = config.makefu.deluge.web;
+  core_conf = pkgs.writeText "deluge-core-cfg" ''
+    {
+      "file": 1,
+      "format": 1
+    }${builtins.toJSON (recursiveUpdate default_core_cfg cfg_daemon.cfg)}
+  '';
+
+  default_core_cfg = {
+    # ports and networking
+    daemon_port = 58846; allow_remote = false;
+    listen_ports = [ 0 0 ]; # from -> to, 0 -> random
+    outgoing_ports = [ 0 0 ];
+    random_port = true;
+    random_outgoing_ports = true;
+    listen_interface = "";
+    # folders
+    move_completed_path = homedir +"/complete"; move_completed = false;
+    autoadd_location = homedir + "/watch"; autoadd_enable = true;
+    download_location = homedir + "/data";
+    torrentfiles_location = homedir + "/torrents"; copy_torrent_file = false; del_copy_torrent_file = false;
+    plugins_location = homedir + "/.config/deluge/plugins"; enabled_plugins = [];
+    geoip_db_location = pkgs.geolite-legacy + "/share/GeoIP/GeoIP.dat";
+    queue_new_to_top = false;
+    info_sent = 0;
+    send_info = false;
+    compact_allocation = false;
+    # peer discovery, extras
+    lsd = true;
+    natpmp = true;
+    utpex = false;
+    dht = false;
+    upnp = true;
+    peer_tos = "0x08";
+    # active torrents
+    dont_count_slow_torrents = false;
+    max_active_limit = -1;
+    max_active_downloading = -1;
+    max_active_seeding = -1;
+    max_upload_slots_global = -1;
+    # seeding
+    share_ratio_limit = -1;
+    seed_time_ratio_limit = -1;
+    seed_time_limit = 180;
+    stop_seed_at_ratio = false;
+    remove_seed_at_ratio = false;
+    stop_seed_ratio = 2;
+    # speed and connections
+    rate_limit_ip_overhead = true;
+    ignore_limits_on_local_network = true;
+    max_download_speed = -1;
+    max_upload_speed = -1;
+    max_upload_speed_per_torrent = -1;
+    max_download_speed_per_torrent = -1;
+    max_half_open_connections = -1;
+    max_connections_global = -1;
+    max_connections_per_second = -1;
+    max_connections_per_torrent = -1;
+    max_upload_slots_per_torrent = -1;
+    enc_in_policy = 1;
+    enc_prefer_rc4 = true;
+    enc_level = 2;
+    enc_out_policy = 1;
+    cache_size = 8192;
+    cache_expiry = 60;
+    prioritize_first_last_pieces = false;
+    auto_managed = true;
+    proxies = {
+      peer = {
+        username = "";
+        password = "";
+        hostname = "";
+        type = 0;
+        port = 8080;
+      };
+      web_seed = {
+        username = "";
+        password = "";
+        hostname = "";
+        type = 0;
+        port = 8080;
+      };
+      tracker = {
+        username = "";
+        password = "";
+        hostname = "";
+        type = 0;
+        port = 8080;
+      };
+      dht = {
+        username = "";
+        password = "";
+        hostname = "";
+        type = 0;
+        port = 8080;
+      };
+    };
+    add_paused = false;
+    new_release_check = false;
+  };
+
+  api = {
+      enable = mkEnableOption "deluge daemon";
+
+      cfg = mkOption {
+        default = default_core_cfg;
+        type = types.attrsOf types.unspecified;
+        description = ''
+          for full configuration see defaults
+        '';
+        example = {
+          "daemon_port"= 58846;
+          "download_location"= "/var/download";
+        };
+      };
+
+      auth = mkOption {
+        default = [];
+        example = ["alice:MyC0mpL3xPass:10"];
+        type = types.lines;
+      };
+
+      homedir = mkOption {
+        default = "/var/lib/deluge";
+        description = "Home directory of deluge user";
+        type = types.str;
+      };
+
+      web = {
+        enable = mkEnableOption "deluge web";
+      };
+    };
+  imp = {
+
+    systemd.services.deluged = {
+      after = [ "network.target" ];
+      description = "Deluge BitTorrent Daemon";
+      wantedBy = [ "multi-user.target" ];
+      serviceConfig = {
+        ExecStart = "${pkgs.pythonPackages.deluge}/bin/deluged -d";
+        ExecStartPre = pkgs.writeDash "deluged-init" ''
+          mkdir -p ${homedir}/.config/deluge
+          cp ${core_conf} ${homedir}/.config/deluge/core.conf
+        '';
+        Restart = "on-success";
+        User = "deluge";
+        Group = "deluge";
+      };
+    };
+
+    systemd.services.delugeweb = mkIf cfg_web.enable {
+      after = [ "network.target" ];
+      description = "Deluge BitTorrent WebUI";
+      wantedBy = [ "multi-user.target" ];
+      serviceConfig.ExecStart = "${pkgs.pythonPackages.deluge}/bin/deluge --ui web";
+      serviceConfig.User = "deluge";
+      serviceConfig.Group = "deluge";
+    };
+
+    environment.systemPackages = [ pkgs.pythonPackages.deluge ];
+
+    users.extraUsers.deluge = {
+      group = "deluge";
+      uid = config.ids.uids.deluge;
+      home = cfg_daemon.homedir;
+      createHome = true;
+      description = "Deluge Daemon user";
+    };
+
+    users.extraGroups.deluge.gid = config.ids.gids.deluge;
+  };
+in {
+  options.makefu.deluge = api;
+  config = lib.mkIf cfg_daemon.enable imp;
+}