1# Upower daemon.
2
3{ config, lib, pkgs, ... }:
4
5with lib;
6
7let
8 cfg = config.services.upower;
9in
10{
11
12 ###### interface
13
14 options = {
15
16 services.upower = {
17
18 enable = mkOption {
19 type = types.bool;
20 default = false;
21 description = ''
22 Whether to enable Upower, a DBus service that provides power
23 management support to applications.
24 '';
25 };
26
27 package = mkOption {
28 type = types.package;
29 default = pkgs.upower;
30 example = lib.literalExample "pkgs.upower";
31 description = ''
32 Which upower package to use.
33 '';
34 };
35
36 };
37
38 };
39
40
41 ###### implementation
42
43 config = mkIf cfg.enable {
44
45 environment.systemPackages = [ cfg.package ];
46
47 services.dbus.packages = [ cfg.package ];
48
49 services.udev.packages = [ cfg.package ];
50
51 systemd.services.upower =
52 { description = "Power Management Daemon";
53 path = [ pkgs.glib ]; # needed for gdbus
54 serviceConfig =
55 { Type = "dbus";
56 BusName = "org.freedesktop.UPower";
57 ExecStart = "@${cfg.package}/libexec/upowerd upowerd";
58 };
59 };
60
61 system.activationScripts.upower =
62 ''
63 mkdir -m 0755 -p /var/lib/upower
64 '';
65
66 # The upower daemon seems to get stuck after doing a suspend
67 # (i.e. subsequent suspend requests will say "Sleep has already
68 # been requested and is pending"). So as a workaround, restart
69 # the daemon.
70 powerManagement.resumeCommands =
71 ''
72 ${config.systemd.package}/bin/systemctl try-restart upower
73 '';
74
75 };
76
77}