grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / hardware / acpid.nix
blob357f692801b4f6d48727c31640f5bf5bca88d8ac
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.acpid;
5   canonicalHandlers = {
6     powerEvent = {
7       event = "button/power.*";
8       action = cfg.powerEventCommands;
9     };
11     lidEvent = {
12       event = "button/lid.*";
13       action = cfg.lidEventCommands;
14     };
16     acEvent = {
17       event = "ac_adapter.*";
18       action = cfg.acEventCommands;
19     };
20   };
22   acpiConfDir = pkgs.runCommand "acpi-events" { preferLocalBuild = true; }
23     ''
24       mkdir -p $out
25       ${
26         # Generate a configuration file for each event. (You can't have
27         # multiple events in one config file...)
28         let f = name: handler:
29           ''
30             fn=$out/${name}
31             echo "event=${handler.event}" > $fn
32             echo "action=${pkgs.writeShellScriptBin "${name}.sh" handler.action }/bin/${name}.sh '%e'" >> $fn
33           '';
34         in lib.concatStringsSep "\n" (lib.mapAttrsToList f (canonicalHandlers // cfg.handlers))
35       }
36     '';
42   ###### interface
44   options = {
46     services.acpid = {
48       enable = lib.mkEnableOption "the ACPI daemon";
50       logEvents = lib.mkOption {
51         type = lib.types.bool;
52         default = false;
53         description = "Log all event activity.";
54       };
56       handlers = lib.mkOption {
57         type = lib.types.attrsOf (lib.types.submodule {
58           options = {
59             event = lib.mkOption {
60               type = lib.types.str;
61               example = lib.literalExpression ''"button/power.*" "button/lid.*" "ac_adapter.*" "button/mute.*" "button/volumedown.*" "cd/play.*" "cd/next.*"'';
62               description = "Event type.";
63             };
65             action = lib.mkOption {
66               type = lib.types.lines;
67               description = "Shell commands to execute when the event is triggered.";
68             };
69           };
70         });
72         description = ''
73           Event handlers.
75           ::: {.note}
76           Handler can be a single command.
77           :::
78         '';
79         default = {};
80         example = {
81           ac-power = {
82             event = "ac_adapter/*";
83             action = ''
84               vals=($1)  # space separated string to array of multiple values
85               case ''${vals[3]} in
86                   00000000)
87                       echo unplugged >> /tmp/acpi.log
88                       ;;
89                   00000001)
90                       echo plugged in >> /tmp/acpi.log
91                       ;;
92                   *)
93                       echo unknown >> /tmp/acpi.log
94                       ;;
95               esac
96             '';
97           };
98         };
99       };
101       powerEventCommands = lib.mkOption {
102         type = lib.types.lines;
103         default = "";
104         description = "Shell commands to execute on a button/power.* event.";
105       };
107       lidEventCommands = lib.mkOption {
108         type = lib.types.lines;
109         default = "";
110         description = "Shell commands to execute on a button/lid.* event.";
111       };
113       acEventCommands = lib.mkOption {
114         type = lib.types.lines;
115         default = "";
116         description = "Shell commands to execute on an ac_adapter.* event.";
117       };
119     };
121   };
124   ###### implementation
126   config = lib.mkIf cfg.enable {
128     systemd.services.acpid = {
129       description = "ACPI Daemon";
130       documentation = [ "man:acpid(8)" ];
132       wantedBy = [ "multi-user.target" ];
134       serviceConfig = {
135         ExecStart = lib.escapeShellArgs
136           ([ "${pkgs.acpid}/bin/acpid"
137              "--foreground"
138              "--netlink"
139              "--confdir" "${acpiConfDir}"
140            ] ++ lib.optional cfg.logEvents "--logevents"
141           );
142       };
143       unitConfig = {
144         ConditionVirtualization = "!systemd-nspawn";
145         ConditionPathExists = [ "/proc/acpi" ];
146       };
148     };
150   };