self: { config, lib, pkgs, system, ... }: let cfg = config.services.dyn-gandi; package = self.packages.${pkgs.stdenv.hostPlatform.system}.default; inherit (lib) mkIf mkEnableOption mkOption types; in { options.services.dyn-gandi = { enable = mkEnableOption "dyn-gandi"; timer = lib.mkOption { type = types.nullOr types.int; default = null; description = lib.mdDoc '' The time intervall in seconds the script should be repeated. ''; }; settings = mkOption { type = with types; let valueType = nullOr (oneOf [ # TODO: restrict type to actual config file structure bool int float str path (attrsOf valueType) (listOf valueType) ]); in valueType; default = throw "Please specify services.dyn-gandi.settings"; }; }; config = mkIf cfg.enable { environment = { systemPackages = [package]; }; # TODO: make this architecture independent xdg.configFile."dyn-gandi/config.json" = { text = builtins.toJSON cfg.settings; }; systemd.services.dyn-gandi = mkIf (cfg.timer != null) { Unit = { After = ["network.target"]; }; Install = {WantedBy = ["default.target"];}; Service = { Type = "oneshot"; ExecStart = "${package}/bin/dyn_gandi"; # TODO: add config file via command line options }; }; systemd.timers.dyn-gandi = mkIf (cfg.timer != null) { Install = {WantedBy = ["timers.target"];}; Timer = { OnBootSec = "0s"; OnUnitActiveSec = "${toString cfg.timer}s"; Unit = "dyn-gandi.service"; }; }; }; }