~ruther/guix-config

ref: a178510f63e4e391479c8eee6cb87e6c062861f5 guix-config/modules/ruther/services/auto-login.scm -rw-r--r-- 1.9 KiB
a178510f — Rutherther chore: update 8 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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)))))))