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