| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  | { config, lib, pkgs, utils, ... }: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | with lib; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-06 03:48:43 +02:00
										 |  |  | let | 
					
						
							| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-06 03:48:43 +02:00
										 |  |  |   cfg = config.services.freefall; | 
					
						
							| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-06 03:48:43 +02:00
										 |  |  | in { | 
					
						
							| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-06 03:48:43 +02:00
										 |  |  |   options.services.freefall = { | 
					
						
							| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-06 03:48:43 +02:00
										 |  |  |     enable = mkOption { | 
					
						
							|  |  |  |       type = types.bool; | 
					
						
							|  |  |  |       default = false; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Whether to protect HP/Dell laptop hard drives (not SSDs) in free fall. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-06 03:48:43 +02:00
										 |  |  |     package = mkOption { | 
					
						
							|  |  |  |       type = types.package; | 
					
						
							|  |  |  |       default = pkgs.freefall; | 
					
						
							| 
									
										
										
										
											2016-01-17 19:34:55 +01:00
										 |  |  |       defaultText = "pkgs.freefall"; | 
					
						
							| 
									
										
										
										
											2015-09-06 03:48:43 +02:00
										 |  |  |       description = ''
 | 
					
						
							|  |  |  |         freefall derivation to use. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-06 03:48:43 +02:00
										 |  |  |     devices = mkOption { | 
					
						
							|  |  |  |       type = types.listOf types.string; | 
					
						
							|  |  |  |       default = [ "/dev/sda" ]; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Device paths to all internal spinning hard drives. | 
					
						
							|  |  |  |       '';
 | 
					
						
							| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   config = let | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mkService = dev: | 
					
						
							|  |  |  |       assert dev != ""; | 
					
						
							|  |  |  |       let dev' = utils.escapeSystemdPath dev; in | 
					
						
							| 
									
										
										
										
											2015-08-03 18:27:57 +02:00
										 |  |  |       nameValuePair "freefall-${dev'}" { | 
					
						
							|  |  |  |         description = "Free-fall protection for ${dev}"; | 
					
						
							| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  |         after = [ "${dev'}.device" ]; | 
					
						
							|  |  |  |         wantedBy = [ "${dev'}.device" ]; | 
					
						
							|  |  |  |         serviceConfig = { | 
					
						
							| 
									
										
										
										
											2015-09-06 03:48:43 +02:00
										 |  |  |           ExecStart = "${cfg.package}/bin/freefall ${dev}"; | 
					
						
							| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  |           Restart = "on-failure"; | 
					
						
							|  |  |  |           Type = "forking"; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   in mkIf cfg.enable { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-06 03:48:43 +02:00
										 |  |  |     environment.systemPackages = [ cfg.package ]; | 
					
						
							| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-06 03:48:43 +02:00
										 |  |  |     systemd.services = builtins.listToAttrs (map mkService cfg.devices); | 
					
						
							| 
									
										
										
										
											2015-01-08 23:38:10 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |