;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Mathieu Othacehe ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (guix scripts user) #:use-module (gnu services) #:use-module (gnu services shepherd) #:use-module (gnu system) #:use-module (guix derivations) #:use-module (guix records) #:use-module (guix scripts) #:use-module (guix scripts build) #:use-module (guix store) #:use-module (guix monads) #:use-module (guix gexp) #:use-module (guix ui) #:use-module (guix utils) #:use-module (ice-9 match) #:use-module (srfi srfi-1) #:use-module (srfi srfi-37) #:export (guix-user)) ;;; ;;; Command-line options. ;;; (define %options ;; Specifications of the command-line options. (cons* (option '(#\h "help") #f #f (lambda args (show-help) (exit 0))) (option '(#\r "reconfigure") #t #f (lambda (opt name arg result) (alist-cons 'action `(reconfigure . ,arg) result))) (option '(#\V "version") #f #f (lambda args (show-version-and-exit "guix user"))) %standard-build-options)) (define %default-options `((system . ,(%current-system)) (substitutes? . #t) (graft? . #t) (max-silent-time . 3600) (verbosity . 0))) (define (show-help) (display (G_ "Usage: guix user [OPTION]... Create a bundle of PACKAGE.\n")) (display (G_ " -r, --reconfigure-services=FILE reconfigure services described in FILE")) (newline) (display (G_ " -h, --help display this help and exit")) (display (G_ " -V, --version display version information and exit")) (newline) (show-bug-report-information)) ;;; ;;; User services. ;;; (define (fold-user-services services) (fold-services (cons* (service user-service-type #f) %shepherd-user-root-service services) #:target-type shepherd-user-service-type)) (define (generate-sheperd-configuration services opts) (mlet* %store-monad ((services -> (fold-user-services services)) (shepherd-conf.drv (service-value services)) (shepherd-launch (gexp->script "shepherd" shepherd-conf.drv)) (drvs -> (list shepherd-launch))) (mbegin %store-monad (show-what-to-build* drvs #:use-substitutes? (assoc-ref opts 'substitutes?)) (built-derivations drvs) (return (derivation->output-path shepherd-launch))))) ;;; ;;; Entry point. ;;; (define %user-module ;; Module in which the user configuration file is loaded. (make-user-module '((gnu system) (gnu services)))) (define (process-action store opts) (let ((action (assoc-ref opts 'action))) (match action (('reconfigure . file) (let* ((user-conf (if file (load* file %user-module) (leave (G_ "no user configuration file specified~%")))) (services (user-configuration-services user-conf))) (format #t "~a\n" (run-with-store store (generate-sheperd-configuration services opts)))))))) (define (guix-user . args) (with-error-handling (let ((opts (parse-command-line args %options (list %default-options))) (store (open-connection))) (process-action store opts))))