From f690ea8c14f85667881115e139da317da5e4e174 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Sat, 12 Sep 2026 18:57:28 +0200 Subject: [PATCH] feat: auto-login prompt choosing between ruther and fbw on tty1 --- config.scm | 6 ++-- modules/ruther/services/auto-login.scm | 49 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 modules/ruther/services/auto-login.scm diff --git a/config.scm b/config.scm index 9c23e73a726c7620c365595f103a71a2c1f3be8f..b9dab06134da0bfafc493f9f8716927b862ec449 100644 --- a/config.scm +++ b/config.scm @@ -25,6 +25,7 @@ (ruther services bind) (ruther services nix-gl) (ruther services nix) + (ruther services auto-login) (ruther services netbird) (ruther packages netbird) (ruther bootloader grub) @@ -394,8 +395,9 @@ (mingetty-service-type config => (if (string=? (mingetty-configuration-tty config) "tty1") (mingetty-configuration (inherit config) - (auto-login "ruther") - (login-pause? #t)) + (auto-login "auto") + (login-program (make-auto-login-program #:users '("ruther" "fbw"))) + (login-pause? #f)) config)) (elogind-service-type config => (elogind-configuration (handle-lid-switch-external-power 'ignore))) diff --git a/modules/ruther/services/auto-login.scm b/modules/ruther/services/auto-login.scm new file mode 100644 index 0000000000000000000000000000000000000000..7fa63df67ac990a26b1ebb7ffed483afee69acb4 --- /dev/null +++ b/modules/ruther/services/auto-login.scm @@ -0,0 +1,49 @@ +(define-module (ruther services auto-login) + #:use-module (guix gexp) + #:use-module (gnu packages admin) + #:use-module (gnu packages base) + #:export (make-auto-login-program)) + +(define* (make-auto-login-program #:key (users '())) + (program-file + "auto-login" + #~(begin + (define users (list #$@users)) + (define marker "/tmp/.auto-login-done") + (define stty-bin #$(file-append coreutils "/bin/stty")) + + (define (show-menu!) + (display "\nAuto-login — choose account:\n") + (let loop ((us users) (i 0)) + (when (pair? us) + (format #t " ~a) ~a\n" (integer->char (+ i (char->integer #\a))) (car us)) + (loop (cdr us) (+ i 1)))) + (display "> ")) + + (define (read-key) + (dynamic-wind + (lambda () (system* stty-bin "-echo" "cbreak")) + (lambda () (read-char)) + (lambda () (system* stty-bin "echo" "-cbreak")))) + + (define (read-choice) + (show-menu!) + (let* ((ch (read-key)) + (idx (- (char->integer ch) (char->integer #\a)))) + (newline) + (if (and (>= idx 0) (< idx (length users))) + (list-ref users idx) + (begin + (display "Invalid choice, try again.\n") + (read-choice))))) + + (let ((login-bin #$(file-append shadow "/bin/login")) + (args (filter (lambda (a) (not (or (string=? a "-f") + (string=? a "auto")))) + (cdr (command-line))))) ; strip -f and dummy username injected by mingetty + (if (file-exists? marker) + (apply execlp login-bin login-bin args) + (let ((user (read-choice))) + (call-with-output-file marker + (lambda (p) (display (getpid) p))) + (apply execlp login-bin login-bin "-f" user args)))))))