~ruther/guix-local

bacadb026c4e9ab75902933954d5cedd17a74537 — Ludovic Courtès 12 years ago c773aba
gnu: shadow: Add record type for user accounts.

* gnu/system/shadow.scm (<user-account>): New record type.
  (passwd-file): Use it.
* gnu/system/vm.scm (system-qemu-image): Adjust accordingly.
2 files changed, 35 insertions(+), 7 deletions(-)

M gnu/system/shadow.scm
M gnu/system/vm.scm
M gnu/system/shadow.scm => gnu/system/shadow.scm +28 -5
@@ 19,7 19,18 @@
(define-module (gnu system shadow)
  #:use-module (guix store)
  #:use-module (ice-9 match)
  #:export (passwd-file))
  #:use-module (guix records)
  #:export (user-account
            user-account?
            user-account-name
            user-account-pass
            user-account-uid
            user-account-gid
            user-account-comment
            user-account-home-directory
            user-account-shell

            passwd-file))

;;; Commentary:
;;;


@@ 27,16 38,28 @@
;;;
;;; Code:

(define-record-type* <user-account>
  user-account make-user-account
  user-account?
  (name           user-account-name)
  (password       user-account-pass (default ""))
  (uid            user-account-uid)
  (gid            user-account-gid)
  (comment        user-account-comment (default ""))
  (home-directory user-account-home-directory)
  (shell          user-account-shell (default "/bin/sh")))

(define* (passwd-file store accounts #:key shadow?)
  "Return a password file for ACCOUNTS, a list of vectors as returned by
'getpwnam'.  If SHADOW? is true, then it is a /etc/shadow file, otherwise it
is a /etc/passwd file."
  "Return a password file for ACCOUNTS, a list of <user-account> objects.  If
SHADOW? is true, then it is a /etc/shadow file, otherwise it is a /etc/passwd
file."
  ;; XXX: The resulting file is world-readable, so beware when SHADOW? is #t!
  (define contents
    (let loop ((accounts accounts)
               (result   '()))
      (match accounts
        ((#(name pass uid gid comment home-dir shell) rest ...)
        ((($ <user-account> name pass uid gid comment home-dir shell)
          rest ...)
         (loop rest
               (cons (if shadow?
                         (string-append name

M gnu/system/vm.scm => gnu/system/vm.scm +7 -2
@@ 475,8 475,13 @@ Happy birthday, GNU!                                http://www.gnu.org/gnu30
           (dmd-file  (string-append (derivation->output-path dmd-drv)
                                     "/bin/dmd"))
           (dmd-conf  (dmd-configuration-file store %dmd-services))
           (accounts  (list (vector "root" "" 0 0 "System administrator"
                                    "/" bash-file)))
           (accounts  (list (user-account
                             (name "root")
                             (password "")
                             (uid 0) (gid 0)
                             (comment "System administrator")
                             (home-directory "/")
                             (shell bash-file))))
           (passwd    (passwd-file store accounts))
           (shadow    (passwd-file store accounts #:shadow? #t))
           (group     (add-text-to-store store "group"