+
+ myServices.monitoring.objects.service = builtins.map (d: {
+ service_description = "Disk /dev/disk/by-id/${d} is sane";
+ use = "local-service";
+ check_command = [ "check_smartctl" "/dev/disk/by-id/${d}" ];
+ __passive_servicegroups = "webstatus-resources";
+
+ check_interval = 60;
+ }) cfg.smartdDisks;
+
+ systemd = let
+ checkShortTimer = {
+ timerConfig = {
+ OnCalendar = "monthly";
+ RandomizedDelaySec = "3 weeks";
+ FixedRandomDelay = true;
+ };
+ wantedBy = [ "timers.target" ];
+ };
+ checkLongTimer = {
+ timerConfig = {
+ OnCalendar = "monthly";
+ RandomizedDelaySec = "3 weeks";
+ FixedRandomDelay = true;
+ };
+ wantedBy = [ "timers.target" ];
+ };
+ toSDTimers = id: {
+ "check-smartd-long-${id}" = checkLongTimer;
+ "check-smartd-short-${id}" = checkShortTimer;
+ };
+ toCheckService = id: type: {
+ description = "Run ${type} smartctl test for /dev/disk/by-id/${id}";
+ after = [ "multi-user.target" ];
+ serviceConfig = {
+ Type = "oneshot";
+ ExecStart = "${pkgs.smartmontools}/bin/smartctl -t ${type} /dev/disk/by-id/${id}";
+ };
+ };
+ toSDServices = id: {
+ "check-smartd-long-${id}" = toCheckService id "long";
+ "check-smartd-short-${id}" = toCheckService id "short";
+ };
+
+ in {
+ services = lib.attrsets.mergeAttrsList (builtins.map toSDServices cfg.smartdDisks);
+ timers = lib.attrsets.mergeAttrsList (builtins.map toSDTimers cfg.smartdDisks);
+ };