2024-12-10 20:26:33 +01:00
|
|
|
|
{ lib, ... }:
|
|
|
|
|
{
|
2023-10-05 17:52:07 +03:00
|
|
|
|
name = "systemd-lock-handler";
|
|
|
|
|
|
|
|
|
|
meta.maintainers = with lib.maintainers; [ liff ];
|
|
|
|
|
|
|
|
|
|
enableOCR = true;
|
|
|
|
|
|
2024-12-10 20:26:33 +01:00
|
|
|
|
nodes.machine =
|
|
|
|
|
{
|
|
|
|
|
config,
|
|
|
|
|
pkgs,
|
|
|
|
|
lib,
|
|
|
|
|
...
|
|
|
|
|
}:
|
2023-10-05 17:52:07 +03:00
|
|
|
|
let
|
|
|
|
|
touch = "${lib.getBin pkgs.coreutils}/bin/touch";
|
|
|
|
|
in
|
|
|
|
|
{
|
|
|
|
|
imports = [ common/wayland-cage.nix ];
|
|
|
|
|
|
|
|
|
|
services.systemd-lock-handler.enable = true;
|
|
|
|
|
|
|
|
|
|
systemd.user.services = {
|
|
|
|
|
test-lock = {
|
|
|
|
|
partOf = [ "lock.target" ];
|
|
|
|
|
onSuccess = [ "unlock.target" ];
|
|
|
|
|
before = [ "lock.target" ];
|
|
|
|
|
wantedBy = [ "lock.target" ];
|
|
|
|
|
serviceConfig.ExecStart = "${touch} /tmp/lock.target.activated";
|
|
|
|
|
};
|
|
|
|
|
test-unlock = {
|
|
|
|
|
partOf = [ "unlock.target" ];
|
|
|
|
|
after = [ "unlock.target" ];
|
|
|
|
|
wantedBy = [ "unlock.target" ];
|
|
|
|
|
serviceConfig.ExecStart = "${touch} /tmp/unlock.target.activated";
|
|
|
|
|
};
|
|
|
|
|
test-sleep = {
|
|
|
|
|
partOf = [ "sleep.target" ];
|
|
|
|
|
before = [ "sleep.target" ];
|
|
|
|
|
wantedBy = [ "sleep.target" ];
|
|
|
|
|
serviceConfig.ExecStart = "${touch} /tmp/sleep.target.activated";
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
testScript = ''
|
|
|
|
|
machine.wait_for_unit('graphical.target')
|
|
|
|
|
machine.wait_for_text('alice@machine')
|
|
|
|
|
|
|
|
|
|
machine.send_chars('loginctl lock-session\n')
|
|
|
|
|
machine.wait_for_file('/tmp/lock.target.activated')
|
|
|
|
|
machine.wait_for_file('/tmp/unlock.target.activated')
|
|
|
|
|
|
|
|
|
|
machine.send_chars('systemctl suspend\n')
|
|
|
|
|
# wait_for_file won’t complete before the machine is asleep,
|
|
|
|
|
# so we’ll watch the log instead.
|
|
|
|
|
machine.wait_for_console_text('Started test-sleep.service.')
|
|
|
|
|
|
|
|
|
|
# The VM is asleep, regular shutdown won’t work.
|
|
|
|
|
machine.crash()
|
|
|
|
|
'';
|
|
|
|
|
}
|