2026-11-01 02:03:45 +01:00
|
|
|
{ config, pkgs, ... }:
|
|
|
|
|
|
2026-11-02 02:25:03 +01:00
|
|
|
# Home Assistant endpoint that puts Nethergarde (truenas VM), ashenvale_crypt and duskwood_crypt to rest.
|
2026-11-01 02:03:45 +01:00
|
|
|
# HTTP API (unprivileged) -> trigger file in /run/fde-lock-api -> path unit -> root oneshot.
|
|
|
|
|
# Token: /etc/nixos/secrets/fde-lock-token (not versioned).
|
|
|
|
|
|
|
|
|
|
let
|
|
|
|
|
listen = "192.168.0.19";
|
|
|
|
|
port = 8742;
|
|
|
|
|
allowed = "192.168.0.14"; # varian (Home Assistant)
|
|
|
|
|
|
|
|
|
|
fde-lock = pkgs.writeShellApplication {
|
|
|
|
|
name = "fde-lock";
|
|
|
|
|
runtimeInputs = with pkgs; [
|
|
|
|
|
coreutils util-linux procps gawk gnused
|
|
|
|
|
lvm2 cryptsetup
|
|
|
|
|
config.virtualisation.incus.clientPackage
|
|
|
|
|
];
|
|
|
|
|
text = builtins.readFile ./fde-lock/lock.sh;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
lockService = mode: {
|
2026-11-02 02:25:03 +01:00
|
|
|
description = "Put Nethergarde, ashenvale_crypt and duskwood_crypt to rest (${mode})";
|
2026-11-01 02:03:45 +01:00
|
|
|
# Never (re)started by a rebuild, only by its path unit.
|
|
|
|
|
restartIfChanged = false;
|
|
|
|
|
serviceConfig = {
|
|
|
|
|
Type = "oneshot";
|
|
|
|
|
ExecStart = "${fde-lock}/bin/fde-lock ${mode}";
|
|
|
|
|
StandardInput = "null";
|
2026-11-01 18:05:38 +01:00
|
|
|
TimeoutStartSec = "4min";
|
2026-11-01 02:03:45 +01:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
trigger = name: {
|
|
|
|
|
wantedBy = [ "paths.target" ];
|
|
|
|
|
pathConfig = {
|
|
|
|
|
PathChanged = "/run/fde-lock-api/${name}";
|
|
|
|
|
Unit = "fde-${name}.service";
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
in
|
|
|
|
|
{
|
|
|
|
|
systemd.services.fde-lock = lockService "lock";
|
|
|
|
|
systemd.services.fde-check = lockService "check";
|
|
|
|
|
systemd.paths.fde-lock = trigger "lock";
|
|
|
|
|
systemd.paths.fde-check = trigger "check";
|
|
|
|
|
|
|
|
|
|
users.users.fde-lock-api = { isSystemUser = true; group = "fde-lock-api"; };
|
|
|
|
|
users.groups.fde-lock-api = { };
|
|
|
|
|
|
|
|
|
|
systemd.tmpfiles.rules = [
|
|
|
|
|
"d /run/fde-lock-api 0755 fde-lock-api fde-lock-api -"
|
|
|
|
|
"d /run/fde-lock 0755 root root -"
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
systemd.services.fde-lock-api = {
|
|
|
|
|
description = "HTTP trigger for fde-lock (Home Assistant)";
|
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
|
|
|
|
wants = [ "network-online.target" ];
|
|
|
|
|
after = [ "network-online.target" ];
|
|
|
|
|
environment = {
|
|
|
|
|
FDE_LOCK_LISTEN = listen;
|
|
|
|
|
FDE_LOCK_PORT = toString port;
|
|
|
|
|
FDE_LOCK_ALLOWED = allowed;
|
|
|
|
|
};
|
|
|
|
|
serviceConfig = {
|
|
|
|
|
ExecStart = "${pkgs.python3}/bin/python3 ${./fde-lock/api.py}";
|
|
|
|
|
User = "fde-lock-api";
|
|
|
|
|
Group = "fde-lock-api";
|
|
|
|
|
LoadCredential = "token:/etc/nixos/secrets/fde-lock-token";
|
|
|
|
|
Restart = "always";
|
|
|
|
|
RestartSec = 5;
|
|
|
|
|
NoNewPrivileges = true;
|
|
|
|
|
ProtectSystem = "strict";
|
|
|
|
|
ProtectHome = true;
|
|
|
|
|
PrivateTmp = true;
|
|
|
|
|
ReadWritePaths = [ "/run/fde-lock-api" ];
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
}
|