at 23.11-pre 3.6 kB view raw
1{ config, lib, pkgs, ... }: 2with lib; 3 4let 5 cfg = config.services.mbpfan; 6 verbose = optionalString cfg.verbose "v"; 7 settingsFormat = pkgs.formats.ini {}; 8 settingsFile = settingsFormat.generate "mbpfan.ini" cfg.settings; 9 10in { 11 options.services.mbpfan = { 12 enable = mkEnableOption (lib.mdDoc "mbpfan, fan controller daemon for Apple Macs and MacBooks"); 13 14 package = mkOption { 15 type = types.package; 16 default = pkgs.mbpfan; 17 defaultText = literalExpression "pkgs.mbpfan"; 18 description = lib.mdDoc "The package used for the mbpfan daemon."; 19 }; 20 21 verbose = mkOption { 22 type = types.bool; 23 default = false; 24 description = lib.mdDoc "If true, sets the log level to verbose."; 25 }; 26 27 aggressive = mkOption { 28 type = types.bool; 29 default = false; 30 description = lib.mdDoc "If true, favors higher default fan speeds."; 31 }; 32 33 settings = mkOption { 34 default = {}; 35 description = lib.mdDoc "INI configuration for Mbpfan."; 36 type = types.submodule { 37 freeformType = settingsFormat.type; 38 39 options.general.low_temp = mkOption { 40 type = types.int; 41 default = 63; 42 description = lib.mdDoc "If temperature is below this, fans will run at minimum speed."; 43 }; 44 options.general.high_temp = mkOption { 45 type = types.int; 46 default = 66; 47 description = lib.mdDoc "If temperature is above this, fan speed will gradually increase."; 48 }; 49 options.general.max_temp = mkOption { 50 type = types.int; 51 default = 86; 52 description = lib.mdDoc "If temperature is above this, fans will run at maximum speed."; 53 }; 54 options.general.polling_interval = mkOption { 55 type = types.int; 56 default = 1; 57 description = lib.mdDoc "The polling interval."; 58 }; 59 }; 60 }; 61 }; 62 63 imports = [ 64 (mkRenamedOptionModule [ "services" "mbpfan" "pollingInterval" ] [ "services" "mbpfan" "settings" "general" "polling_interval" ]) 65 (mkRenamedOptionModule [ "services" "mbpfan" "maxTemp" ] [ "services" "mbpfan" "settings" "general" "max_temp" ]) 66 (mkRenamedOptionModule [ "services" "mbpfan" "lowTemp" ] [ "services" "mbpfan" "settings" "general" "low_temp" ]) 67 (mkRenamedOptionModule [ "services" "mbpfan" "highTemp" ] [ "services" "mbpfan" "settings" "general" "high_temp" ]) 68 (mkRenamedOptionModule [ "services" "mbpfan" "minFanSpeed" ] [ "services" "mbpfan" "settings" "general" "min_fan1_speed" ]) 69 (mkRenamedOptionModule [ "services" "mbpfan" "maxFanSpeed" ] [ "services" "mbpfan" "settings" "general" "max_fan1_speed" ]) 70 ]; 71 72 config = mkIf cfg.enable { 73 services.mbpfan.settings = mkIf cfg.aggressive { 74 general.min_fan1_speed = mkDefault 2000; 75 general.low_temp = mkDefault 55; 76 general.high_temp = mkDefault 58; 77 general.max_temp = mkDefault 70; 78 }; 79 80 boot.kernelModules = [ "coretemp" "applesmc" ]; 81 environment.systemPackages = [ cfg.package ]; 82 environment.etc."mbpfan.conf".source = settingsFile; 83 84 systemd.services.mbpfan = { 85 description = "A fan manager daemon for MacBook Pro"; 86 wantedBy = [ "sysinit.target" ]; 87 after = [ "syslog.target" "sysinit.target" ]; 88 restartTriggers = [ config.environment.etc."mbpfan.conf".source ]; 89 serviceConfig = { 90 Type = "simple"; 91 ExecStart = "${cfg.package}/bin/mbpfan -f${verbose}"; 92 ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; 93 PIDFile = "/run/mbpfan.pid"; 94 Restart = "always"; 95 }; 96 }; 97 }; 98}