From 34afbea236ac2bc83bdd786bd569bce71d62df81 Mon Sep 17 00:00:00 2001 From: Peter Hoeg Date: Sat, 26 Mar 2016 22:41:30 +0800 Subject: [PATCH] flexget nixos module: run the service and specify configuration This module adds support for defining a flexget service. Due to flexget insisting on being able to write all over where it finds its configuration file, we use a ExecStartPre hook to copy the generated configuration file into place under the user's home. It's fairly ugly and I'm very open to suggestions --- nixos/modules/module-list.nix | 1 + nixos/modules/services/torrent/flexget.nix | 100 +++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 nixos/modules/services/torrent/flexget.nix diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index a23e787bd08e..5b3d19e0bbaf 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 000000000000..696710fcd451 --- /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"; + }; + }; + }; +}