about summary refs log tree commit diff
path: root/modules/user/aszlig/vlock/default.nix
diff options
context:
space:
mode:
authoraszlig <aszlig@redmoonstudios.org>2015-03-18 02:46:15 +0100
committeraszlig <aszlig@redmoonstudios.org>2015-03-18 02:46:15 +0100
commite91c0b0c2269a8ab0158863dc1c074daf46001f7 (patch)
treecfb21b6e78bc61de7b653a71db5af06a61951a72 /modules/user/aszlig/vlock/default.nix
parent147ee83ee25b0c5d4a0600b12e31d6c994a5a9ca (diff)
modules: Move own stuff into modules/user/aszlig.
Some modules might be generic enough to be included in modules/
directly, but for now, let's just get them out of the way.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Diffstat (limited to 'modules/user/aszlig/vlock/default.nix')
-rw-r--r--modules/user/aszlig/vlock/default.nix51
1 files changed, 51 insertions, 0 deletions
diff --git a/modules/user/aszlig/vlock/default.nix b/modules/user/aszlig/vlock/default.nix
new file mode 100644
index 00000000..11e9a475
--- /dev/null
+++ b/modules/user/aszlig/vlock/default.nix
@@ -0,0 +1,51 @@
+{ pkgs, config, lib, ... }:
+
+let
+  messageFile = pkgs.runCommand "message.cat" {} ''
+    echo -en '\e[H\e[2J\e[?25l' > "$out"
+    "${pkgs.aacolorize}/bin/aacolorize" \
+      "${./message.cat}" "${./message.colmap}" \
+      >> "$out"
+  '';
+
+  esc = "\\\\033";
+  unlockCSI = "${esc}[16;39H${esc}[?25h${esc}[K";
+
+  vlock = lib.overrideDerivation pkgs.vlock (o: {
+    postPatch = (o.postPatch or "") + ''
+      echo -n '"' > src/message.h
+      sed -e ':nl;N;$!bnl;s/[\\"]/\\&/g;s/\n/\\n/g' "${messageFile}" \
+        >> src/message.h
+      sed -i -e '$s/$/"/' src/message.h
+      sed -i -e 's!getenv("VLOCK_MESSAGE")!\n#include "message.h"\n!' \
+        src/vlock-main.c
+      sed -i -re 's/(fprintf[^"]*")(.*user)/\1${unlockCSI}\2/' \
+        src/auth-pam.c
+    '';
+  });
+in {
+  options.vuizvui.vlock.enable = lib.mkEnableOption "console lock";
+
+  config.systemd.sockets.vlock = {
+    description = "Console Lock Socket";
+    wantedBy = [ "sockets.target" ];
+    socketConfig.ListenStream = "/run/console-lock.sock";
+    socketConfig.Accept = true;
+  };
+
+  config.systemd.services."vlock@" = lib.mkIf config.vuizvui.vlock.enable {
+    description = "Lock All Consoles";
+    serviceConfig.Type = "oneshot";
+
+    #environment.USER = "%i"; XXX
+    environment.USER = "aszlig";
+
+    script = ''
+      retval=0
+      oldvt="$("${pkgs.kbd}/bin/fgconsole")"
+      "${vlock}/bin/vlock" -asn || retval=$?
+      if [ $retval -ne 0 ]; then "${pkgs.kbd}/bin/chvt" "$oldvt"; fi
+      exit $retval
+    '';
+  };
+}