aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2018, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
;;;
;;; 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 <http://www.gnu.org/licenses/>.

(define-module (gnu installer newt)
  #:use-module (gnu installer record)
  #:use-module (gnu installer utils)
  #:use-module (gnu installer dump)
  #:use-module (gnu installer newt ethernet)
  #:use-module (gnu installer newt final)
  #:use-module (gnu installer newt parameters)
  #:use-module (gnu installer newt hostname)
  #:use-module (gnu installer newt kernel)
  #:use-module (gnu installer newt keymap)
  #:use-module (gnu installer newt locale)
  #:use-module (gnu installer newt menu)
  #:use-module (gnu installer newt network)
  #:use-module (gnu installer newt page)
  #:use-module (gnu installer newt partition)
  #:use-module (gnu installer newt services)
  #:use-module (gnu installer newt substitutes)
  #:use-module (gnu installer newt timezone)
  #:use-module (gnu installer newt user)
  #:use-module (gnu installer newt utils)
  #:use-module (gnu installer newt welcome)
  #:use-module (gnu installer newt wifi)
  #:use-module (guix config)
  #:use-module (guix discovery)
  #:use-module (guix i18n)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-26)
  #:use-module (srfi srfi-34)
  #:use-module (srfi srfi-35)
  #:use-module (ice-9 ftw)
  #:use-module (ice-9 match)
  #:use-module (newt)
  #:export (newt-installer))

(define (init)
  (newt-init)
  (clear-screen)
  (set-screen-size!)
  (installer-log-line "Display is ~ax~a." (screen-columns) (screen-rows))
  (push-help-line
   (format #f (G_ "Press <F1> for installation parameters."))))

(define (exit)
  (newt-finish)
  (clear-screen))

(define (exit-error error)
  ;; Newt may be suspended in the context of the "install-system"
  ;; procedure. Resume it unconditionnally.
  (newt-resume)
  (newt-set-color COLORSET-ROOT "white" "red")
  (define action
    (run-textbox-page
     #:info-text (G_ "The installer has encountered an unexpected problem. \
The backtrace is displayed below. You may choose to exit or create a dump \
archive.")
     #:title (G_ "Unexpected problem")
     #:content error
     #:buttons-spec
     (list
      (cons (G_ "Dump") (const 'dump))
      (cons (G_ "Exit") (const 'exit)))))
  (newt-set-color COLORSET-ROOT "white" "blue")
  action)

(define (report-page dump-archive)
  (define text
    (format #f (G_ "The dump archive was created as ~a.  Would you like to \
send this archive to the Guix servers?") dump-archive))
  (define title (G_ "Dump archive created"))
  (when (run-confirmation-page text title)
    (let* ((uploaded-name (send-dump-report dump-archive))
           (text (if uploaded-name
                     (format #f (G_ "The dump was uploaded as ~a.  Please \
report it by email to ~a.") uploaded-name %guix-bug-report-address)
                     (G_ "The dump could not be uploaded."))))
      (run-error-page
       text
       (G_ "Dump upload result")))))

(define (dump-page dump-dir)
  (define files
    (scandir dump-dir (lambda (x)
                        (not (or (string=? x ".")
                                 (string=? x ".."))))))
  (fold (match-lambda*
          (((file . enable?) acc)
           (if enable?
               (cons file acc)
               acc)))
        '()
        (run-dump-page
         dump-dir
         (map (lambda (x)
                (cons x #f))
              files))))

(define (newt-run-command . args)
  (define command-output "")
  (define (line-accumulator line)
    (set! command-output
          (string-append/shared command-output line)))
  (define result (run-external-command-with-line-hooks (list line-accumulator)
                                                       args))
  (define exit-val (status:exit-val result))
  (define term-sig (status:term-sig result))
  (define stop-sig (status:stop-sig result))

  (if (and exit-val (zero? exit-val))
      #t
      (let ((info-text
             (cond
              (exit-val
               (format #f (G_ "External command ~s exited with code ~a")
                       args exit-val))
              (term-sig
               (format #f (G_ "External command ~s terminated by signal ~a")
                       args term-sig))
              (stop-sig
               (format #f (G_ "External command ~s stopped by signal ~a")
                       args stop-sig)))))
        (run-textbox-page #:title (G_ "External command error")
                          #:info-text info-text
                          #:content command-output
                          #:buttons-spec
                          (list
                           (cons "Ignore" (const #t))
                           (cons "Abort"
                                 (lambda ()
                                   (abort-to-prompt 'installer-step 'abort)))
                           (cons "Report"
                                 (lambda ()
                                   (raise
                                    (condition
                                     ((@@ (guix build utils)
                                          &invoke-error)
                                      (program (car args))
                                      (arguments (cdr args))
                                      (exit-status exit-val)
                                      (term-signal term-sig)
                                      (stop-signal stop-sig)))))))))))

(define (final-page result prev-steps dry-run?)
  (run-final-page result prev-steps dry-run?))

(define* (locale-page #:key
                      supported-locales
                      iso639-languages
                      iso3166-territories
                      dry-run?)
  (run-locale-page
   #:supported-locales supported-locales
   #:iso639-languages iso639-languages
   #:iso3166-territories iso3166-territories
   #:dry-run? dry-run?))

(define (timezone-page zonetab)
  (run-timezone-page zonetab))

(define* (welcome-page logo #:key pci-database)
  (run-welcome-page logo #:pci-database pci-database))

(define (menu-page steps)
  (run-menu-page steps))

(define (keymap-page layouts context dry-run?)
  (run-keymap-page layouts #:context context #:dry-run? dry-run?))

(define (network-page)
  (run-network-page))

(define (substitutes-page)
  (run-substitutes-page))

(define (hostname-page)
  (run-hostname-page))

(define (kernel-page)
  (run-kernel-page))

(define (user-page)
  (run-user-page))

(define (partitioning-page)
  (run-partitioning-page))

(define (services-page)
  (run-services-page))

(define (parameters-menu menu-proc)
  (newt-set-help-callback menu-proc))

(define (parameters-page keyboard-layout-selection)
  (run-parameters-page keyboard-layout-selection))

(define newt-installer
  (installer
   (name 'newt)
   (init init)
   (exit exit)
   (exit-error exit-error)
   (final-page final-page)
   (keymap-page keymap-page)
   (kernel-page kernel-page)
   (locale-page locale-page)
   (menu-page menu-page)
   (network-page network-page)
   (substitutes-page substitutes-page)
   (timezone-page timezone-page)
   (hostname-page hostname-page)
   (user-page user-page)
   (partitioning-page partitioning-page)
   (services-page services-page)
   (welcome-page welcome-page)
   (parameters-menu parameters-menu)
   (parameters-page parameters-page)
   (dump-page dump-page)
   (run-command newt-run-command)
   (report-page report-page)))
uts]: Receive some inputs. * gnu/services/guix.scm (make-guix-build-coordinator-start-script): Adjust the start script to include propagated inputs. Christopher Baines 2020-10-23services: guix: Fix the guix-build-coordinator metrics namespace....The underscore is now handled in the guile prometheus library. * gnu/services/guix.scm (make-guix-build-coordinator-start-script): Remove the underscore from the end of the metrics namespace. Christopher Baines 2020-10-23services: guix-build-coordinator: Configure output buffering....Otherwise the logging is garbled. * gnu/services/guix.scm (make-guix-build-coordinator-start-script): Configure line output buffering for stdout and stderr. Christopher Baines 2020-10-23services: guix-build-coordinator: Include the system profile in PATH....As this allows hooks to use the system profile, if that's desired. * gnu/services/guix.scm (guix-build-coordinator-shepherd-services): Set PATH to include the system profile. Christopher Baines 2020-10-23services: guix-build-coordinator: Output the start script name....As this can be useful for debugging purposes. * gnu/services/guix.scm (make-guix-build-coordinator-start-script): Output the current filename. Christopher Baines 2020-10-23services: guix: Fix hooks gexp issue for the Guix Build Coordinator....* gnu/services/guix.scm (make-guix-build-coordinator-start-script): Fix handling the name within the hook gexp. Christopher Baines 2020-10-20services: guix: Fix coordinator agent....* gnu/services/guix.scm (guix-build-coordinator-agent-activation): Define %user variable. Mathieu Othacehe 2020-10-08services: guix: Don't use normalized codeset for Guix Data Service....This matches up with changes in the Guix Data Service to not use the normalized codeset. * gnu/services/guix.scm (guix-data-service-shepherd-services): Change the LC_ALL codeset to UTF-8. Christopher Baines 2020-10-05services: guix: Add guix-build-coordinator-queue-builds-service-type....* gnu/services/guix.scm (<guix-build-coordinator-queue-builds-configuration>): New record type. (guix-build-coordinator-queue-builds-configuration, guix-build-coordinator-queue-builds-configuration?, guix-build-coordinator-queue-builds-configuration-package, guix-build-coordinator-queue-builds-configuration-user, guix-build-coordinator-queue-builds-coordinator, guix-build-coordinator-queue-builds-configuration-systems, guix-build-coordinator-queue-builds-configuration-system-and-targets, guix-build-coordinator-queue-builds-configuration-guix-data-service, guix-build-coordinator-queue-builds-configuration-processed-commits-file, guix-build-coordinator-queue-builds-shepherd-services, guix-build-coordinator-queue-builds-activation, guix-build-coordinator-queue-builds-account): New procedures. (guix-build-coordinator-queue-builds-service-type): New variable. * doc/guix.texi (Guix Services): Document it. Christopher Baines 2020-10-05services: guix: Add guix-build-coordinator-agent-service-type....* gnu/services/guix.scm (<guix-build-coordinator-agent-configuration>): New record type. (guix-build-coordinator-agent-configuration, guix-build-coordinator-agent-configuration?, guix-build-coordinator-agent-configuration-package, guix-build-coordinator-agent-configuration-user, guix-build-coordinator-agent-configuration-coordinator, guix-build-coordinator-agent-configuration-uuid), guix-build-coordinator-agent-configuration-password, guix-build-coordinator-agent-configuration-password-file, guix-build-coordinator-agent-configuration-systems, guix-build-coordinator-agent-configuration-max-parallel-builds, guix-build-coordinator-agent-configuration-derivation-substitute-urls, guix-build-coordinator-agent-configuration-non-derivation-substitute-urls, guix-build-coordinator-agent-shepherd-services, guix-build-coordinator-agent-activation, guix-build-coordinator-agent-account): New procedures. (guix-build-coordinator-agent-service-type): New variable. * doc/guix.texi (Guix Services): Document it. Christopher Baines 2020-10-05services: guix: Add guix-build-coordinator-service-type....* gnu/services/guix.scm (<guix-build-coordinator-configuration>): New record type. (guix-build-coordinator-configuration, guix-build-coordinator-configuration?, guix-build-coordinator-configuration-package, guix-build-coordinator-configuration-user, guix-build-coordinator-configuration-group, guix-build-coordinator-configuration-datastore-uri-string, guix-build-coordinator-configuration-agent-communication-uri-string, guix-build-coordinator-configuration-client-communication-uri-string, guix-build-coordinator-configuration-allocation-strategy, guix-build-coordinator-configuration-hooks, guix-build-coordinator-configuration-guile, make-guix-build-coordinator-start-script, guix-build-coordinator-shepherd-services, guix-build-coordinator-activation, guix-build-coordinator-account): New procedures. (guix-build-coordinator-service-type): New variable. * gnu/tests/guix.scm (%test-guix-build-coordinator): New variable. * doc/guix.texi (Guix Services): Document it. Christopher Baines 2020-03-08services: guix-data-service: Allow passing extra options....This is so that the options supported by the service configuration don't have to always be changed. Generally though all options should be explicitly supported and documented, so this is mostly to facilitate experimentation. * gnu/services/guix.scm (<guix-data-service-configuration>): Add extra-options and extra-process-jobs-options to the record type. (guix-data-service-shepherd-services): Handle these new configuration record fields. * doc/guix.texi (Guix Data Service): Document these new options. Christopher Baines