diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 7a656a58e9c..f4416a06fc9 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -374,6 +374,7 @@ ./services/hardware/nvidia-optimus.nix ./services/hardware/pcscd.nix ./services/hardware/pommed.nix + ./services/hardware/power-profiles-daemon.nix ./services/hardware/ratbagd.nix ./services/hardware/sane.nix ./services/hardware/sane_extra_backends/brscan4.nix diff --git a/nixos/modules/services/hardware/power-profiles-daemon.nix b/nixos/modules/services/hardware/power-profiles-daemon.nix new file mode 100644 index 00000000000..70b7a72b8ba --- /dev/null +++ b/nixos/modules/services/hardware/power-profiles-daemon.nix @@ -0,0 +1,53 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.services.power-profiles-daemon; + package = pkgs.power-profiles-daemon; +in + +{ + + ###### interface + + options = { + + services.power-profiles-daemon = { + + enable = mkOption { + type = types.bool; + default = false; + description = '' + Whether to enable power-profiles-daemon, a DBus daemon that allows + changing system behavior based upon user-selected power profiles. + ''; + }; + + }; + + }; + + + ###### implementation + + config = mkIf cfg.enable { + + assertions = [ + { assertion = !config.services.tlp.enable; + message = '' + You have set services.power-profiles-daemon.enable = true; + which conflicts with services.tlp.enable = true; + ''; + } + ]; + + services.dbus.packages = [ package ]; + + services.udev.packages = [ package ]; + + systemd.packages = [ package ]; + + }; + +} diff --git a/nixos/tests/power-profiles-daemon.nix b/nixos/tests/power-profiles-daemon.nix new file mode 100644 index 00000000000..422008316f0 --- /dev/null +++ b/nixos/tests/power-profiles-daemon.nix @@ -0,0 +1,45 @@ +import ./make-test-python.nix ({ pkgs, ... }: + +{ + name = "power-profiles-daemon"; + meta = with pkgs.stdenv.lib.maintainers; { + maintainers = [ mvnetbiz ]; + }; + machine = { pkgs, ... }: { + services.power-profiles-daemon.enable = true; + environment.systemPackages = [ pkgs.glib ]; + }; + + testScript = '' + def get_profile(): + return machine.succeed( + """gdbus call --system --dest net.hadess.PowerProfiles --object-path /net/hadess/PowerProfiles \ + --method org.freedesktop.DBus.Properties.Get 'net.hadess.PowerProfiles' 'ActiveProfile' + """ + ) + + + def set_profile(profile): + return machine.succeed( + """gdbus call --system --dest net.hadess.PowerProfiles --object-path /net/hadess/PowerProfiles \ + --method org.freedesktop.DBus.Properties.Set 'net.hadess.PowerProfiles' 'ActiveProfile' "<'{profile}'>" + """.format( + profile=profile + ) + ) + + + machine.wait_for_unit("multi-user.target") + + set_profile("power-saver") + profile = get_profile() + if not "power-saver" in profile: + raise Exception("Unable to set power-saver profile") + + + set_profile("balanced") + profile = get_profile() + if not "balanced" in profile: + raise Exception("Unable to set balanced profile") + ''; +}) diff --git a/pkgs/os-specific/linux/power-profiles-daemon/default.nix b/pkgs/os-specific/linux/power-profiles-daemon/default.nix new file mode 100644 index 00000000000..c477e6f3679 --- /dev/null +++ b/pkgs/os-specific/linux/power-profiles-daemon/default.nix @@ -0,0 +1,66 @@ +{ stdenv +, lib +, pkg-config +, meson +, ninja +, fetchFromGitLab +, libgudev +, glib +, gobject-introspection +, gettext +, gtk-doc +, docbook-xsl-nons +, docbook_xml_dtd_412 +, libxml2 +, libxslt +, upower +, systemd +}: + +stdenv.mkDerivation rec { + pname = "power-profiles-daemon"; + version = "0.1"; + + outputs = [ "out" "devdoc" ]; + + src = fetchFromGitLab { + domain = "gitlab.freedesktop.org"; + owner = "hadess"; + repo = "power-profiles-daemon"; + rev = version; + sha256 = "012w3aryw5d43dr9jj5i6wy2a0n21jidr4ggs9ix7d4z9byr175w"; + }; + + nativeBuildInputs = [ + pkg-config + meson + ninja + gettext + gtk-doc + docbook-xsl-nons + docbook_xml_dtd_412 + libxml2 # for xmllint for stripping GResources + libxslt # for xsltproc for building docs + gobject-introspection + ]; + + buildInputs = [ + libgudev + systemd + upower + glib + ]; + + mesonFlags = [ + "-Dsystemdsystemunitdir=${placeholder "out"}/lib/systemd/system" + "-Dgtk_doc=true" + ]; + + meta = with lib; { + homepage = "https://gitlab.freedesktop.org/hadess/power-profiles-daemon"; + description = "Makes user-selected power profiles handling available over D-Bus"; + platforms = platforms.linux; + license = licenses.gpl3Plus; + maintainers = with maintainers; [ mvnetbiz ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 066d57526a5..a800e795289 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -7181,6 +7181,8 @@ in povray = callPackage ../tools/graphics/povray { }; + power-profiles-daemon = callPackage ../os-specific/linux/power-profiles-daemon { }; + ppl = callPackage ../development/libraries/ppl { }; pplatex = callPackage ../tools/typesetting/tex/pplatex { };