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