nixpkgs/modules/services/monitoring/smartd.nix
Peter Simons 3a1b6266e4 modules/services/monitoring/smartd.nix: added services.smartd.devices option to configure list of devices to monitor
By default -- if this option is unset --, all connected devices will be
monitored. Hard-coding the list of devices is worth-while, though, because this
will also configure smartd to send e-mail messages to 'root' when a test fails.

svn path=/nixos/trunk/; revision=27888
2011-07-21 19:32:15 +00:00

85 lines
2.1 KiB
Nix

{ config, pkgs, ... }:
with pkgs.lib;
let
cfg = config.services.smartd;
smartdMail = pkgs.writeScript "smartdmail.sh" ''
#! /bin/sh
TMPNAM=/tmp/smartd-message.$$.tmp
if test -n "$SMARTD_ADDRESS"; then
echo >"$TMPNAM" "From: smartd <root>"
echo >>"$TMPNAM" 'To: undisclosed-recipients:;'
echo >>"$TMPNAM" "Subject: $SMARTD_SUBJECT"
echo >>"$TMPNAM"
echo >>"$TMPNAM" "Failure on $SMARTD_DEVICESTRING: $SMARTD_FAILTYPE"
echo >>"$TMPNAM"
cat >>"$TMPNAM"
${pkgs.smartmontools}/sbin/smartctl >>"$TMPNAM" -a -d "$SMARTD_DEVICETYPE" "$SMARTD_DEVICE"
/var/setuid-wrappers/sendmail <"$TMPNAM" -f "$SENDER" -i "$SMARTD_ADDRESS"
fi
'';
smartdConf = pkgs.writeText "smartd.conf" (concatMapStrings (device:
''
${device} -m root -M exec ${smartdMail}
''
) cfg.devices);
smartdFlags = if (cfg.devices == []) then "" else "--configfile=${smartdConf}";
in
{
###### interface
options = {
services.smartd = {
enable = mkOption {
default = false;
type = types.bool;
example = "true";
description = ''
Run smartd from the smartmontools package. Note that e-mail
notifications will not be enabled unless you configure the list of
devices with <varname>services.smartd.devices</varname> as well.
'';
};
devices = mkOption {
default = [];
example = ["/dev/sda" "/dev/sdb"];
description = ''
List of devices to monitor. By default -- if this list is empty --,
smartd will monitor all devices connected to the machine at the time
it's being run. Configuring this option has the added benefit of
enabling e-mail notifications to "root" every time smartd detects an
error.
'';
};
};
};
###### implementation
config = mkIf cfg.enable {
jobs.smartd =
{ description = "S.M.A.R.T. Daemon";
startOn = "started syslogd";
daemonType = "daemon";
exec = "${pkgs.smartmontools}/sbin/smartd --pidfile=/var/run/smartd.pid ${smartdFlags}";
};
};
}