summary refs log tree commit diff
path: root/nixos/modules/hardware/sensor/hddtemp.nix
blob: df3f75e229a2f26e44bf94eeb2205b03564e678a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
{ config, lib, pkgs, ... }:
let
  inherit (lib) mkIf mkOption types;

  cfg = config.hardware.sensor.hddtemp;

  wrapper = pkgs.writeShellScript "hddtemp-wrapper" ''
    set -eEuo pipefail

    file=/var/lib/hddtemp/hddtemp.db

    drives=(${toString (map (e: ''$(realpath ${lib.escapeShellArg e}) '') cfg.drives)})

    cp ${pkgs.hddtemp}/share/hddtemp/hddtemp.db $file
    ${lib.concatMapStringsSep "\n" (e: "echo ${lib.escapeShellArg e} >> $file") cfg.dbEntries}

    exec ${pkgs.hddtemp}/bin/hddtemp ${lib.escapeShellArgs cfg.extraArgs} \
      --daemon \
      --unit=${cfg.unit} \
      --file=$file \
      ''${drives[@]}
  '';

in
{
  meta.maintainers = with lib.maintainers; [ peterhoeg ];

  ###### interface

  options = {
    hardware.sensor.hddtemp = {
      enable = mkOption {
        description = ''
          Enable this option to support HDD/SSD temperature sensors.
        '';
        type = types.bool;
        default = false;
      };

      drives = mkOption {
        description = "List of drives to monitor. If you pass /dev/disk/by-path/* entries the symlinks will be resolved as hddtemp doesn't like names with colons.";
        type = types.listOf types.str;
      };

      unit = mkOption {
        description = "Celcius or Fahrenheit";
        type = types.enum [ "C" "F" ];
        default = "C";
      };

      dbEntries = mkOption {
        description = "Additional DB entries";
        type = types.listOf types.str;
        default = [ ];
      };

      extraArgs = mkOption {
        description = "Additional arguments passed to the daemon.";
        type = types.listOf types.str;
        default = [ ];
      };
    };
  };

  ###### implementation

  config = mkIf cfg.enable {
    systemd.services.hddtemp = {
      description = "HDD/SSD temperature";
      wantedBy = [ "multi-user.target" ];
      serviceConfig = {
        Type = "forking";
        ExecStart = wrapper;
        StateDirectory = "hddtemp";
        PrivateTmp = true;
        ProtectHome = "tmpfs";
        ProtectSystem = "strict";
      };
    };
  };
}