diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index a23e787bd08..5b3d19e0bba 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -427,6 +427,7 @@
./services/system/nscd.nix
./services/system/uptimed.nix
./services/torrent/deluge.nix
+ ./services/torrent/flexget.nix
./services/torrent/peerflix.nix
./services/torrent/transmission.nix
./services/ttys/agetty.nix
diff --git a/nixos/modules/services/torrent/flexget.nix b/nixos/modules/services/torrent/flexget.nix
new file mode 100644
index 00000000000..696710fcd45
--- /dev/null
+++ b/nixos/modules/services/torrent/flexget.nix
@@ -0,0 +1,100 @@
+{ config, lib, pkgs, timezone, ... }:
+
+with lib;
+
+let
+ cfg = config.services.flexget;
+ pkg = pkgs.python27Packages.flexget;
+ ymlFile = pkgs.writeText "flexget.yml" ''
+ ${cfg.config}
+
+ ${optionalString cfg.systemScheduler "schedules: no"}
+'';
+ configFile = "${toString cfg.homeDir}/flexget.yml";
+in {
+ options = {
+ services.flexget = {
+ enable = mkEnableOption "Run FlexGet Daemon";
+
+ user = mkOption {
+ default = "deluge";
+ example = "some_user";
+ type = types.string;
+ description = "The user under which to run flexget.";
+ };
+
+ homeDir = mkOption {
+ default = /var/lib/deluge;
+ example = "/home/flexget";
+ type = types.path;
+ description = "Where files live.";
+ };
+
+ interval = mkOption {
+ default = "10m";
+ example = "1h";
+ type = types.string;
+ description = "When to perform a flexget run. See man 7 systemd.time for the format.";
+ };
+
+ systemScheduler = mkOption {
+ default = true;
+ example = "false";
+ type = types.bool;
+ description = "When true, execute the runs via the flexget-runner.timer. If false, you have to specify the settings yourself in the YML file.";
+ };
+
+ config = mkOption {
+ default = "";
+ type = types.lines;
+ description = "The YAML configuration for FlexGet.";
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+
+ environment.systemPackages = [ pkgs.python27Packages.flexget ];
+
+ systemd.services = {
+ flexget = {
+ description = "FlexGet Daemon";
+ path = [ pkgs.pythonPackages.flexget ];
+ serviceConfig = {
+ User = cfg.user;
+ Environment = "TZ=${config.time.timeZone}";
+ ExecStartPre = "${pkgs.coreutils}/bin/install -m644 ${ymlFile} ${configFile}";
+ ExecStart = "${pkg}/bin/flexget -c ${configFile} daemon start";
+ ExecStop = "${pkg}/bin/flexget -c ${configFile} daemon stop";
+ ExecReload = "${pkg}/bin/flexget -c ${configFile} daemon reload";
+ Restart = "on-failure";
+ PrivateTmp = true;
+ WorkingDirectory = toString cfg.homeDir;
+ };
+ wantedBy = [ "multi-user.target" ];
+ };
+
+ flexget-runner = mkIf cfg.systemScheduler {
+ description = "FlexGet Runner";
+ after = [ "flexget.service" ];
+ wants = [ "flexget.service" ];
+ serviceConfig = {
+ User = cfg.user;
+ ExecStart = "${pkg}/bin/flexget -c ${configFile} execute";
+ PrivateTmp = true;
+ WorkingDirectory = toString cfg.homeDir;
+ };
+ };
+ };
+
+ systemd.timers.flexget-runner = mkIf cfg.systemScheduler {
+ description = "Run FlexGet every ${cfg.interval}";
+ wantedBy = [ "timers.target" ];
+ timerConfig = {
+ OnBootSec = "5m";
+ OnUnitInactiveSec = cfg.interval;
+ Unit = "flexget-runner.service";
+ };
+ };
+ };
+}