 8a56a55bb4
			
		
	
	
		8a56a55bb4
		
			
		
	
	
	
	
		
			
			Should bring most of the examples into a better consistency regarding syntactic representation in the manual. Thanks to @devhell for reporting. Signed-off-by: aszlig <aszlig@redmoonstudios.org>
		
			
				
	
	
		
			117 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, lib, pkgs, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
| 
 | |
|   cfg = config.services.smartd;
 | |
| 
 | |
|   smartdOpts = { name, ... }: {
 | |
| 
 | |
|     options = {
 | |
| 
 | |
|       device = mkOption {
 | |
|         example = "/dev/sda";
 | |
|         type = types.str;
 | |
|         description = "Location of the device.";
 | |
|       };
 | |
| 
 | |
|       options = mkOption {
 | |
|         default = "";
 | |
|         example = "-d sat";
 | |
|         type = types.separatedString " ";
 | |
|         description = "Options that determine how smartd monitors the device.";
 | |
|       };
 | |
|     };
 | |
| 
 | |
|   };
 | |
| 
 | |
|   smartdMail = pkgs.writeScript "smartdmail.sh" ''
 | |
|     #! ${pkgs.stdenv.shell}
 | |
|     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.device} -a -m root -M exec ${smartdMail} ${device.options} ${cfg.deviceOpts}
 | |
|     ''
 | |
|     ) 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.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       deviceOpts = mkOption {
 | |
|         default = "";
 | |
|         type = types.string;
 | |
|         example = "-o on -s (S/../.././02|L/../../7/04)";
 | |
|         description = ''
 | |
|           Additional options for each device that is monitored. The example
 | |
|           turns on SMART Automatic Offline Testing on startup, and schedules short
 | |
|           self-tests daily, and long self-tests weekly.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       devices = mkOption {
 | |
|         default = [];
 | |
|         example = [ { device = "/dev/sda"; } { device = "/dev/sdb"; options = "-d sat"; } ];
 | |
|         type = types.listOf types.optionSet;
 | |
|         options = [ smartdOpts ];
 | |
|         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 {
 | |
| 
 | |
|     systemd.services.smartd = {
 | |
|       description = "S.M.A.R.T. Daemon";
 | |
| 
 | |
|       wantedBy = [ "multi-user.target" ];
 | |
| 
 | |
|       serviceConfig.ExecStart = "${pkgs.smartmontools}/sbin/smartd --no-fork ${smartdFlags}";
 | |
|     };
 | |
| 
 | |
|   };
 | |
| 
 | |
| }
 |