{ lib, config, options, pkgs, modulesPath, ... }: with lib; let cfg = config.yoda.de-p1st-monitor; my-python-packages = ps: with ps; [ # de-p1st-monitor is not (yet) packaged, thus we build it from PyPI ( buildPythonPackage rec { pname = "de.p1st.monitor"; version = "0.11.5"; # https://nixos.wiki/wiki/Packaging/Python#Fix_Missing_setup.py format = "pyproject"; src = fetchPypi { inherit pname version; sha256 = "sha256-sPPyasMk3HgVWTpVMKKf0YP8uH5q9sho5z5In2vMcZs="; }; propagatedBuildInputs = [ # Dependencies pkgs.python3Packages.psutil # Build dependencies build twine ]; } ) ]; in { options = { yoda.de-p1st-monitor = mkOption { type = types.str; example = '' [logging] dir = /var/log/de-p1st-monitor/ [network.1] network_interface = wlan0 ''; description = '' Content of /etc/de-p1st-monitor/''${hostname}.ini ''; }; }; config = { # Install de.p1st.monitor packages. environment.systemPackages = [ (pkgs.python3.withPackages my-python-packages) # Dependency of de.p1st.monitor. pkgs.smartmontools ]; # Dependency of de.p1st.monitor boot.kernelModules = [ "drivetemp" ]; # Create configuration file. environment.etc."de-p1st-monitor/${config.networking.hostName}.ini".text = cfg; # Create de.p1st.monitor timer. systemd.timers."de.p1st.monitor" = { wantedBy = [ "timers.target" ]; partOf = [ "de.p1st.monitor.service" ]; timerConfig = { OnBootSec = "0m"; OnUnitInactiveSec = "3m"; AccuracySec = "15s"; RandomizedDelaySec = "15s"; }; }; systemd.services."de.p1st.monitor" = { serviceConfig = { Type = "oneshot"; PrivateTmp = true; # `smartctl` requires root to access /dev/* devices and read their temperatures. User = "root"; Nice = 19; IOSchedulingClass = "idle"; ExecStart = "${pkgs.python3.withPackages my-python-packages}/bin/de-p1st-monitor"; }; path = with pkgs; [ # Provides `findmnt` binary. libuuid smartmontools ]; }; }; }