{ config, lib, ... }: let cfg = config.services.nix-verify; verify-type = with lib.types; attrsOf ( submodule ( { name, ... }: { options = { enable = lib.mkEnableOption "verify status of nix store"; service-name = lib.mkOption { type = lib.types.str; description = "the name of the systemd service. ${name} by default"; default = name; }; verify-contents = lib.mkEnableOption "verify contents of nix store"; verify-trust = lib.mkEnableOption "verify if each path is trusted"; signatures-needed = lib.mkOption { type = lib.types.int; description = "number of signatures needed when verifying trust. Not needed if verify-trust is disabled or not set."; default = -1; }; frequency = lib.mkOption { type = lib.types.str; description = "systemd-timer compatible time between pulls"; default = "1day"; }; randomized-delay-sec = lib.mkOption { type = lib.types.str; description = "systemd-timer compatible time randomized delay"; default = "0"; }; }; } ) ); in { options = { services.nix-verify = lib.mkOption { type = verify-type; default = { }; }; }; config = let verifiers = lib.filterAttrs (_: { enable, ... }: enable) cfg; in { systemd.services = lib.mapAttrs' ( _: { service-name, verify-contents, verify-trust, signatures-needed, ... }: lib.nameValuePair "nix-verifiers@${service-name}" { requires = [ "multi-user.target" ]; after = [ "multi-user.target" ]; description = "Verify nix store (verify-contents: ${lib.boolToString verify-contents}, verify-trust: " + "${lib.boolToString verify-trust}, signatures-needed: ${builtins.toString signatures-needed})"; serviceConfig = { Type = "oneshot"; User = "root"; ExecStart = "${config.nix.package}/bin/nix store verify --all " + lib.optionalString (!verify-contents) "--no-contents " + lib.optionalString (!verify-trust) "--no-trust " + lib.optionalString (signatures-needed >= 0) "--sigs-needed ${signatures-needed}"; }; } ) verifiers; systemd.timers = lib.mapAttrs' ( _: { service-name, frequency, randomized-delay-sec, ... }: lib.nameValuePair "nix-verifiers@${service-name}" { wantedBy = [ "timers.target" ]; timerConfig = { OnBootSec = frequency; OnUnitActiveSec = frequency; RandomizedDelaySec = randomized-delay-sec; Unit = "nix-verifiers@${service-name}.service"; }; } ) verifiers; }; }