nixos/preload: init
[NixPkgs.git] / nixos / modules / services / hardware / freefall.nix
blob7b794264ff35e2f11176b7fc56e64a4fe971aa29
1 { config, lib, pkgs, utils, ... }:
3 with lib;
5 let
7   cfg = config.services.freefall;
9 in {
11   options.services.freefall = {
13     enable = mkOption {
14       type = types.bool;
15       default = false;
16       description = lib.mdDoc ''
17         Whether to protect HP/Dell laptop hard drives (not SSDs) in free fall.
18       '';
19     };
21     package = mkOption {
22       type = types.package;
23       default = pkgs.freefall;
24       defaultText = literalExpression "pkgs.freefall";
25       description = lib.mdDoc ''
26         freefall derivation to use.
27       '';
28     };
30     devices = mkOption {
31       type = types.listOf types.str;
32       default = [ "/dev/sda" ];
33       description = lib.mdDoc ''
34         Device paths to all internal spinning hard drives.
35       '';
36     };
38   };
40   config = let
42     mkService = dev:
43       assert dev != "";
44       let dev' = utils.escapeSystemdPath dev; in
45       nameValuePair "freefall-${dev'}" {
46         description = "Free-fall protection for ${dev}";
47         after = [ "${dev'}.device" ];
48         wantedBy = [ "${dev'}.device" ];
49         serviceConfig = {
50           ExecStart = "${cfg.package}/bin/freefall ${dev}";
51           Restart = "on-failure";
52           Type = "forking";
53         };
54       };
56   in mkIf cfg.enable {
58     environment.systemPackages = [ cfg.package ];
60     systemd.services = builtins.listToAttrs (map mkService cfg.devices);
62   };