inputs: { config, lib, pkgs, ... }: let cfg = config.cloudns; package = inputs.self.packages.${pkgs.stdenv.hostPlatform.system}.default; inherit (lib) mkIf mkEnableOption mkOption types; format = pkgs.formats.json {}; configFile = format.generate "config.json" cfg.settings; in { options.cloudns = { enable = mkEnableOption "cloudns"; timer = lib.mkOption { type = types.nullOr types.int; default = null; description = lib.mdDoc '' The time interval 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 cloudns.settings"; }; }; config = mkIf cfg.enable { environment.systemPackages = [package]; systemd.services.cloudns = mkIf (cfg.timer != null) { script = "${package}/bin/cloudns --config ${configFile}"; requires = ["network-online.target"]; serviceConfig = { Type = "oneshot"; }; }; systemd.timers.cloudns = mkIf (cfg.timer != null) { wantedBy = ["timers.target"]; timerConfig = { OnBootSec = "0s"; OnUnitActiveSec = "${toString cfg.timer}s"; Unit = "dcloudns.service"; }; }; }; }