activation: Copy the account skeletons when creating the 'root' account.

* gnu/build/activation.scm (%skeleton-directory): New variable.
  (dot-or-dot-dot?, copy-account-skeletons): New procedure.
  (add-user): Use 'copy-account-skeletons'.
  (activate-etc): Use 'dot-or-dot-dot?'.
This commit is contained in:
Ludovic Courtès 2014-12-13 22:30:44 +01:00
parent ccc2678b0d
commit 45c5b47b96

View file

@ -50,6 +50,25 @@ (define* (add-group name #:key gid password system?
,name)))
(zero? (apply system* "groupadd" args))))
(define %skeleton-directory
;; Directory containing skeleton files for new accounts.
;; Note: keep the trailing '/' so that 'scandir' enters it.
"/etc/skel/")
(define (dot-or-dot-dot? file)
(member file '("." "..")))
(define* (copy-account-skeletons home
#:optional (directory %skeleton-directory))
"Copy the account skeletons from DIRECTORY to HOME."
(let ((files (scandir directory (negate dot-or-dot-dot?)
string<?)))
(mkdir-p home)
(for-each (lambda (file)
(copy-file (string-append directory "/" file)
(string-append home "/" file)))
files)))
(define* (add-user name group
#:key uid comment home shell password system?
(supplementary-groups '())
@ -70,6 +89,7 @@ (define* (add-user name group
(cut format <> "~a:x:~a:~a:~a:~a:~a~%"
name "0" "0" comment home shell))
(chmod "/etc/shadow" #o600)
(copy-account-skeletons (or home "/root"))
#t)
;; Use 'useradd' from the Shadow package.
@ -198,9 +218,7 @@ (define (rm-f file)
;; XXX: Dirty hack to meet sudo's expectations.
(when (string=? (basename target) "sudoers")
(chmod target #o440))))
(scandir etc
(lambda (file)
(not (member file '("." ".."))))
(scandir etc (negate dot-or-dot-dot?)
;; The default is 'string-locale<?', but we don't have
;; it when run from the initrd's statically-linked