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 defaultText = "pkgs.upower";
31 example = lib.literalExample "pkgs.upower";
32 description = ''
33 Which upower package to use.
34 '';
35 };
36
37 };
38
39 };
40
41
42 ###### implementation
43
44 config = mkIf cfg.enable {
45
46 environment.systemPackages = [ cfg.package ];
47
48 services.dbus.packages = [ cfg.package ];
49
50 services.udev.packages = [ cfg.package ];
51
52 systemd.services.upower =
53 { description = "Power Management Daemon";
54 path = [ pkgs.glib ]; # needed for gdbus
55 serviceConfig =
56 { Type = "dbus";
57 BusName = "org.freedesktop.UPower";
58 ExecStart = "@${cfg.package}/libexec/upowerd upowerd";
59 };
60 };
61
62 system.activationScripts.upower =
63 ''
64 mkdir -m 0755 -p /var/lib/upower
65 '';
66
67 # The upower daemon seems to get stuck after doing a suspend
68 # (i.e. subsequent suspend requests will say "Sleep has already
69 # been requested and is pending"). So as a workaround, restart
70 # the daemon.
71 powerManagement.resumeCommands =
72 ''
73 ${config.systemd.package}/bin/systemctl try-restart upower
74 '';
75
76 };
77
78}