Unverified Commit 7c2f22b3 authored by Seth Flynn's avatar Seth Flynn Committed by GitHub
Browse files

nixos/hddfancontrol: use attrset for config (#394826)

parents 84049bd2 3dd5d860
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -562,7 +562,7 @@

- All services that require a root certificate bundle now use the value of a new read-only option, `security.pki.caBundle`.

- hddfancontrol has been updated to major release 2. See the [migration guide](https://github.com/desbma/hddfancontrol/tree/master?tab=readme-ov-file#migrating-from-v1x), as there are breaking changes.
- hddfancontrol has been updated to major release 2. See the [migration guide](https://github.com/desbma/hddfancontrol/tree/master?tab=readme-ov-file#migrating-from-v1x), as there are breaking changes. The settings options have been modified to use an attrset, enabling configurations with multiple instances of the daemon running at once, eg, for two separate drive bays.

- `nextcloud-news-updater` is unmaintained and was removed from nixpkgs.

+143 −51
Original line number Diff line number Diff line
@@ -18,12 +18,40 @@ in
      "hddfancontrol"
      "smartctl"
    ] "Smartctl is now automatically used when necessary, which makes this option redundant")
    (lib.mkRemovedOptionModule [
      "services"
      "hddfancontrol"
      "disks"
    ] "Disks should now be specified per hddfancontrol instance in its attrset")
    (lib.mkRemovedOptionModule [
      "services"
      "hddfancontrol"
      "pwmPaths"
    ] "Pwm Paths should now be specified per hddfancontrol instance in its attrset")
    (lib.mkRemovedOptionModule [
      "services"
      "hddfancontrol"
      "logVerbosity"
    ] "Log Verbosity should now be specified per hddfancontrol instance in its attrset")
    (lib.mkRemovedOptionModule [
      "services"
      "hddfancontrol"
      "extraArgs"
    ] "Extra Args should now be specified per hddfancontrol instance in its attrset")
  ];

  options = {
    services.hddfancontrol.enable = lib.mkEnableOption "hddfancontrol daemon";

    services.hddfancontrol.disks = lib.mkOption {
    services.hddfancontrol.settings = lib.mkOption {
      type = lib.types.attrsWith {
        placeholder = "drive-bay-name";
        elemType = (
          lib.types.submodule (
            { ... }:
            {
              options = {
                disks = lib.mkOption {
                  type = lib.types.listOf lib.types.path;
                  default = [ ];
                  description = ''
@@ -32,7 +60,7 @@ in
                  example = [ "/dev/sda" ];
                };

    services.hddfancontrol.pwmPaths = lib.mkOption {
                pwmPaths = lib.mkOption {
                  type = lib.types.listOf lib.types.path;
                  default = [ ];
                  description = ''
@@ -41,7 +69,7 @@ in
                  example = [ "/sys/class/hwmon/hwmon2/pwm1:30:10" ];
                };

    services.hddfancontrol.logVerbosity = lib.mkOption {
                logVerbosity = lib.mkOption {
                  type = lib.types.enum [
                    "TRACE"
                    "DEBUG"
@@ -55,7 +83,7 @@ in
                  '';
                };

    services.hddfancontrol.extraArgs = lib.mkOption {
                extraArgs = lib.mkOption {
                  type = lib.types.listOf lib.types.str;
                  default = [ ];
                  description = ''
@@ -67,15 +95,85 @@ in
                  ];
                };
              };
            }
          )
        );
      };
      default = { };
      description = ''
        Parameter-sets for each instance of hddfancontrol.
      '';
      example = lib.literalExpression ''
        {
          harddrives = {
            disks = [
              "/dev/sda"
              "/dev/sdb"
              "/dev/sdc"
            ];
            pwmPaths = [
              "/sys/class/hwmon/hwmon1/pwm1:25:10"
            ];
            logVerbosity = "DEBUG";
          };
          ssddrives = {
            disks = [
              "/dev/sdd"
              "/dev/sde"
              "/dev/sdf"
            ];
            pwmPaths = [
              "/sys/class/hwmon/hwmon1/pwm2:25:10"
            ];
            extraArgs = [
              "--interval=30s"
            ];
          };
        }
      '';
    };
  };

  config = lib.mkIf cfg.enable (
    let
      args = lib.concatLists [
      args =
        cnf:
        lib.concatLists [
          [ "-d" ]
        cfg.disks
          cnf.disks
          [ "-p" ]
        cfg.pwmPaths
        cfg.extraArgs
          cnf.pwmPaths
          cnf.extraArgs
        ];

      createService = cnf: {
        description = "HDD fan control";
        documentation = [ "man:hddfancontrol(1)" ];
        after = [ "hddtemp.service" ];
        wants = [ "hddtemp.service" ];
        serviceConfig = {
          ExecStart = "${lib.getExe pkgs.hddfancontrol} -v ${cnf.logVerbosity} daemon ${lib.escapeShellArgs (args cnf)}";

          CPUSchedulingPolicy = "rr";
          CPUSchedulingPriority = 49;

          ProtectSystem = "strict";
          PrivateTmp = true;
          ProtectHome = true;
          SystemCallArchitectures = "native";
          MemoryDenyWriteExecute = true;
          NoNewPrivileges = true;
        };
        wantedBy = [ "multi-user.target" ];
      };

      services = lib.attrsets.mergeAttrsList [
        (lib.attrsets.mapAttrs' (
          name: cnf: lib.nameValuePair "hddfancontrol-${name}" (createService cnf)
        ) cfg.settings)
        {
          "hddfancontrol".enable = false;
        }
      ];
    in
    {
@@ -83,16 +181,10 @@ in

      hardware.sensor.hddtemp = {
        enable = true;
        drives = cfg.disks;
        drives = lib.lists.flatten (lib.attrsets.catAttrs "disks" (lib.attrsets.attrValues cfg.settings));
      };

      systemd.services.hddfancontrol = {
        wantedBy = [ "multi-user.target" ];
        environment = {
          HDDFANCONTROL_LOG_LEVEL = cfg.logVerbosity;
          HDDFANCONTROL_DAEMON_ARGS = lib.escapeShellArgs args;
        };
      };
      systemd.services = services;
    }
  );
}