summary refs log tree commit diff
path: root/gnu/system
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-11-10 21:23:03 +0100
committerLudovic Courtès <ludo@gnu.org>2015-11-11 00:37:50 +0100
commit21059b26b070d6064202272982392a299f09b6e4 (patch)
treebfce015366cfa65f0b248c6a638792ddfb0a8982 /gnu/system
parentba583bd2ce887cdd8b99ea55c15b57c5209e4b58 (diff)
downloadguix-21059b26b070d6064202272982392a299f09b6e4.tar.gz
system: Populate /etc/shells from ACCOUNT-SERVICE-TYPE.
* gnu/system.scm (user-shells): Remove.
  (operating-system-etc-service): Remove "shells" entry.
  (shells-file): Move to...
* gnu/system/shadow.scm (shells-file): ... here.  New procedure.
  (etc-skel): Rename to...
  (etc-files): ... this.  Add "shells" entry.
  (account-service-type): Adjust accordingly.
Diffstat (limited to 'gnu/system')
-rw-r--r--gnu/system/shadow.scm30
1 files changed, 26 insertions, 4 deletions
diff --git a/gnu/system/shadow.scm b/gnu/system/shadow.scm
index 3f49c1fc9f..7f3a1dfac2 100644
--- a/gnu/system/shadow.scm
+++ b/gnu/system/shadow.scm
@@ -280,11 +280,33 @@ group."
       (activate-users+groups (list #$@user-specs)
                              (list #$@group-specs))))
 
-(define (etc-skel arguments)
+(define (shells-file shells)
+  "Return a file-like object that builds a shell list for use as /etc/shells
+based on SHELLS.  /etc/shells is used by xterm, polkit, and other programs."
+  (computed-file "shells"
+                 #~(begin
+                     (use-modules (srfi srfi-1))
+
+                     (define shells
+                       (delete-duplicates (list #$@shells)))
+
+                     (call-with-output-file #$output
+                       (lambda (port)
+                         (display "\
+/bin/sh
+/run/current-system/profile/bin/sh
+/run/current-system/profile/bin/bash\n" port)
+                         (for-each (lambda (shell)
+                                     (display shell port)
+                                     (newline port))
+                                   shells))))))
+(define (etc-files arguments)
   "Filter out among ARGUMENTS things corresponding to skeletons, and return
 the /etc/skel directory for those."
-  (let ((skels (filter pair? arguments)))
-    `(("skel" ,(skeleton-directory skels)))))
+  (let ((skels (filter pair? arguments))
+        (users (filter user-account? arguments)))
+    `(("skel" ,(skeleton-directory skels))
+      ("shells" ,(shells-file (map user-account-shell users))))))
 
 (define account-service-type
   (service-type (name 'account)
@@ -298,7 +320,7 @@ the /etc/skel directory for those."
                  (list (service-extension activation-service-type
                                           account-activation)
                        (service-extension etc-service-type
-                                          etc-skel)))))
+                                          etc-files)))))
 
 (define (account-service accounts+groups skeletons)
   "Return a <service> that takes care of user accounts and user groups, with