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 [ 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 = "cloudns.service"; }; }; }; }