57 lines
1.7 KiB
Nix
57 lines
1.7 KiB
Nix
|
{ pkgs, utils, lib, config, ... }:
|
||
|
with lib;
|
||
|
let
|
||
|
cfg = config.services.btrfsScrub;
|
||
|
in
|
||
|
{
|
||
|
options.services.btrfsScrub = {
|
||
|
enable = mkEnableOption "Periodically run btrfs-scrub on filesystems";
|
||
|
enableFailureEmail = mkOption {
|
||
|
type = types.bool;
|
||
|
default = true;
|
||
|
description = mdDoc "Send e-mail on scrub failure";
|
||
|
};
|
||
|
paths = mkOption {
|
||
|
type = with types; attrsOf (submodule {
|
||
|
options = {
|
||
|
onCalendar = mkOption {
|
||
|
type = str;
|
||
|
default = "*-*-* 02:00:00";
|
||
|
};
|
||
|
};
|
||
|
});
|
||
|
};
|
||
|
};
|
||
|
|
||
|
config.services.statusEmail.enable = mkIf (cfg.enable && cfg.enableFailureEmail) true;
|
||
|
|
||
|
config.systemd.services."btrfs-scrub@" = mkIf cfg.enable {
|
||
|
unitConfig = {
|
||
|
Description = "Scrub btrfs volume %I";
|
||
|
OnFailure = mkIf cfg.enableFailureEmail "status-email@%n.service";
|
||
|
};
|
||
|
serviceConfig = {
|
||
|
Type = "simple";
|
||
|
ExecStart = "${pkgs.btrfs-progs}/bin/btrfs scrub start -B -d %f";
|
||
|
# ExecStop = "-${pkgs.btrfs-progs}/bin/btrfs scrub cancel %f";
|
||
|
Nice = 19;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
config.systemd.timers = mkIf cfg.enable (mapAttrs' (name: value:
|
||
|
let
|
||
|
pathEscaped = utils.escapeSystemdPath name;
|
||
|
in
|
||
|
nameValuePair "btrfs-scrub-${pathEscaped}"
|
||
|
{
|
||
|
wantedBy = [ "timers.target" ];
|
||
|
enable = true;
|
||
|
timerConfig = {
|
||
|
Unit = "btrfs-scrub@${pathEscaped}.service";
|
||
|
OnCalendar = value.onCalendar;
|
||
|
RandomizedDelaySec = "1h";
|
||
|
Persistent = true;
|
||
|
};
|
||
|
}) cfg.paths);
|
||
|
}
|