aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2019 David Thompson <davet@gnu.org>
;;; Copyright © 2019 Jakob L. Kreuze <zerodaysfordays@sdf.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 machine)
  #:use-module (gnu system)
  #:use-module (guix derivations)
  #:use-module (guix monads)
  #:use-module (guix records)
  #:use-module (guix store)
  #:use-module ((guix diagnostics) #:select (source-properties->location))
  #:use-module (srfi srfi-35)
  #:export (environment-type
            environment-type?
            environment-type-name
            environment-type-description
            environment-type-location

            machine
            machine?

            machine-operating-system
            machine-environment
            machine-configuration
            machine-display-name

            deploy-machine
            roll-back-machine
            machine-remote-eval

            &deploy-error
            deploy-error?
            deploy-error-should-roll-back
            deploy-error-captured-args))

;;; Commentary:
;;;
;;; This module provides the types used to declare individual machines in a
;;; heterogeneous Guix deployment. The interface allows users to specify system
;;; configurations and the means by which resources should be provisioned on a
;;; per-host basis.
;;;
;;; Code:


;;;
;;; Declarations for resources that can be provisioned.
;;;

(define-record-type* <environment-type> environment-type
  make-environment-type
  environment-type?

  ;; Interface to the environment type's deployment code. Each procedure
  ;; should take the same arguments as the top-level procedure of this file
  ;; that shares the same name. For example, 'machine-remote-eval' should be
  ;; of the form '(machine-remote-eval machine exp)'.
  (machine-remote-eval environment-type-machine-remote-eval) ; procedure
  (deploy-machine      environment-type-deploy-machine)      ; procedure
  (roll-back-machine   environment-type-roll-back-machine)   ; procedure

  ;; Metadata.
  (name        environment-type-name)       ; symbol
  (description environment-type-description ; string
               (default #f))
  (location    environment-type-location    ; <location>
               (default (and=> (current-source-location)
                               source-properties->location))
               (innate)))


;;;
;;; Declarations for machines in a deployment.
;;;

(define-record-type* <machine> machine make-machine
  machine?
  (operating-system %machine-operating-system); <operating-system>
  (environment      machine-environment)      ; symbol
  (configuration    machine-configuration     ; configuration object
                    (default #f)))            ; specific to environment

(define (machine-operating-system machine)
  "Return the operating system of MACHINE."
  (operating-system-with-provenance
   (%machine-operating-system machine)))

(define (machine-display-name machine)
  "Return the host-name identifying MACHINE."
  (operating-system-host-name (machine-operating-system machine)))

(define (machine-remote-eval machine exp)
  "Evaluate EXP, a gexp, on MACHINE. Ensure that all the elements EXP refers to
are built and deployed to MACHINE beforehand."
  (let ((environment (machine-environment machine)))
    ((environment-type-machine-remote-eval environment) machine exp)))

(define (deploy-machine machine)
  "Monadic procedure transferring the new system's OS closure to the remote
MACHINE, activating it on MACHINE and switching MACHINE to the new generation."
  (let ((environment (machine-environment machine)))
    ((environment-type-deploy-machine environment) machine)))

(define (roll-back-machine machine)
  "Monadic procedure rolling back to the previous system generation on
MACHINE. Return the number of the generation that was current before switching
and the new generation number."
  (let ((environment (machine-environment machine)))
    ((environment-type-roll-back-machine environment) machine)))


;;;
;;; Error types.
;;;

(define-condition-type &deploy-error &error
  deploy-error?
  (should-roll-back deploy-error-should-roll-back)
  (captured-args deploy-error-captured-args))
ges/aux-files?id=6408f9f6b9533f5951880c6017e19a9ea92d6831'>gnu: linux-libre: Fix typo in the configuration for 5.7 on x86_64....* gnu/packages/aux-files/linux-libre/5.7-x86_64.conf: Fix typo. Leo Famulari 2020-08-05gnu: linux-libre: Update to 5.7.12....* gnu/packages/aux-files/linux-libre/5.7-arm.conf, gnu/packages/aux-files/linux-libre/5.7-arm64.conf, gnu/packages/aux-files/linux-libre/5.7-i686.conf, gnu/packages/aux-files/linux-libre/5.7-x86_64.conf: New files. * Makefile.am (AUX_FILES): Update accordingly. * gnu/packages/linux.scm: (linux-libre-5.7): New variable. (linux-libre-version, linux-libre-pristine-source) (linux-libre-source, linux-libre): Point to linux-libre-5.7*. Leo Famulari 2020-07-28pack: "fakechroot" engine always creates its store....Previously it would silently fail to create the /gnu/store symlink when the host has a read-only /gnu as is the case in these tests. * gnu/packages/aux-files/run-in-namespace.c (exec_with_loader): Unlink the ancestor of ORIGINAL_STORE under NEW_ROOT. Check the return value of 'symlink' when creating NEW_STORE. * tests/guix-pack-relocatable.sh: Check the contents of the store as seen by the wrapped executable, with all three engines, and with both "/gnu" and "/gnu/store" erased. Ludovic Courtès 2020-07-28pack: "fakechroot" execution engine can load its audit module....Fixes <https://bugs.gnu.org/42558>. Until now, loading 'pack-audit.so' in a truly non-Guix environment would usually fail because 'pack-audit.so' depends on 'libgcc_s.so' and 'libc.so', none of which could be found. Furthermore, the test was not working as expected: the trick unshare -mrf sh -c 'mount -t tmpfs none /gnu ; ...' would allow the fakechroot engine to make its store available as /gnu/store as a result of another bug. * gnu/packages/aux-files/run-in-namespace.c (relocated_search_path): New function. (exec_with_loader): Pass "--library-path" to the loader. * guix/scripts/pack.scm (wrapped-package)[build](runpath): New procedure. (elf-loader-compile-flags): Pass "-DLOADER_AUDIT_RUNPATH". * tests/guix-pack-relocatable.sh: Remove 'STORE_PARENT'. (run_without_store): New function. Erase $NIX_STORE_DIR instead of $STORE_PARENT. Use 'run_without_store' throughout. Ludovic Courtès 2020-05-14pack: Add relocation via ld.so and fakechroot....* gnu/packages/aux-files/run-in-namespace.c (HAVE_EXEC_WITH_LOADER): New macro. (bind_mount): Rename to... (mirror_directory): ... this. Add 'firmlink' argument and use it instead of calling mkdir/open/close/mount directly. (bind_mount, make_symlink): New functions. (exec_in_user_namespace): Adjust accordingly. (exec_with_loader) [HAVE_EXEC_WITH_LOADER]: New function. (exec_performance): New function. (engines): Add them. * guix/scripts/pack.scm (wrapped-package)[fakechroot-library] [audit-module]: New procedures. [audit-source]: New variable. [build](elf-interpreter, elf-loader-compile-flags): New procedures. (build-wrapper): Use them. * tests/guix-pack-relocatable.sh: Test with 'GUIX_EXECUTION_ENGINE=fakechroot'. * doc/guix.texi (Invoking guix pack): Document the 'performance' and 'fakechroot' engines. * gnu/packages/aux-files/pack-audit.c: New file. * Makefile.am (AUX_FILES): Add it. Ludovic Courtès 2020-05-14pack: Factorize store references in wrapper....* gnu/packages/aux-files/run-in-namespace.c (original_store): New variable. (exec_in_user_namespace, exec_with_proot, main): Use it instead of the literal "@STORE_DIRECTORY@". Ludovic Courtès 2020-05-14pack: Wrapper honors 'GUIX_EXECUTION_ENGINE' environment variable....* gnu/packages/aux-files/run-in-namespace.c (struct engine): New type. (exec_default): New function. (engines): New variable. (execution_engine): New function. (main): Use it instead of calling 'exec_in_user_namespace' and 'exec_with_proot' directly. * tests/guix-pack-relocatable.sh: Add test with 'GUIX_EXECUTION_ENGINE'. * doc/guix.texi (Invoking guix pack): Document 'GUIX_EXECUTION_ENGINE'. Ludovic Courtès 2020-05-07pack: Factorize 'exec_in_user_namespace' wrapper....* gnu/packages/aux-files/run-in-namespace.c (exec_in_user_namespace): New function, with code taken from... (main): ... here. Call it. Ludovic Courtès 2020-05-07pack: Add 'xmalloc' in wrapper....* gnu/packages/aux-files/run-in-namespace.c (xmalloc): New function. (concat): Use it. Ludovic Courtès 2020-05-07pack: Fix off-by-one in PRoot handling in the wrapper....* gnu/packages/aux-files/run-in-namespace.c (exec_with_proot): Make 'proot_argv' one element larger to account for the terminating NULL. Ludovic Courtès 2020-04-24pack: 'guix pack -R' wrapper correctly reports exit code....Fixes <https://bugs.gnu.org/40816>. Reported by Jan (janneke) Nieuwenhuizen <janneke@gnu.org>. * gnu/packages/aux-files/run-in-namespace.c (main): In the 'default' case, check 'WIFEXITED (status)' and exit with the corresponding code in that case. Exit with 255 in other cases. * tests/guix-pack-relocatable.sh: Add test. Ludovic Courtès 2020-03-22gnu: linux-libre-arm-veyron: Deprecate package....* gnu/packages/linux (linux-libre-arm-veyron): Mark as deprecated package. (kernel-config-veyron): Remove obsolete function. * gnu/system/examples/asus-c201.tmpl: Update to use linux-libre-arm-generic. * gnu/packages/aux-files/linux-libre/5.4-arm-veyron.conf: Delete file. * Makefile.am (AUX_FILES): Update accordingly. Vagrant Cascadian 2020-03-22gnu: emacs: Remove obsolete FIXME comment....* gnu/packages/aux-files/emacs/guix-emacs.el: Remove comment. Maxim Cournoyer 2020-02-27emacs-build-system: Byte compile the autoload files....* guix/build/emacs-build-system.scm (enable-autoloads-compilation) (validate-compiled-autoloads): Add procedures. (%standard-phases): Register the new procedures. * gnu/packages/aux-files/emacs/guix-emacs.el (guix-emacs-find-autoloads): Remove duplicates in the list of autoload files found. * guix/build/emacs-utils.scm (expr->string): Add procedure. (emacs-batch-eval, emacs-batch-edit-file): Use it. Maxim Cournoyer 2020-01-15gnu: linux-libre: Include more framebuffer font sizes....Add the 32x16 Terminus font for ‘high-DPI’ screens, and a 6x10 font that allows for more (debugging) information to be displayed on standard-DPI ones, while still being pleasant to read. * gnu/packages/aux-files/linux-libre/4.14-arm.conf, gnu/packages/aux-files/linux-libre/4.14-i686.conf, gnu/packages/aux-files/linux-libre/4.14-x86_64.conf, gnu/packages/aux-files/linux-libre/4.19-arm.conf, gnu/packages/aux-files/linux-libre/4.19-arm64.conf, gnu/packages/aux-files/linux-libre/4.19-i686.conf, gnu/packages/aux-files/linux-libre/4.19-x86_64.conf, gnu/packages/aux-files/linux-libre/4.4-i686.conf, gnu/packages/aux-files/linux-libre/4.4-x86_64.conf, gnu/packages/aux-files/linux-libre/4.9-i686.conf, gnu/packages/aux-files/linux-libre/4.9-x86_64.conf, gnu/packages/aux-files/linux-libre/5.4-arm-veyron.conf, gnu/packages/aux-files/linux-libre/5.4-arm.conf, gnu/packages/aux-files/linux-libre/5.4-arm64.conf, gnu/packages/aux-files/linux-libre/5.4-i686.conf, gnu/packages/aux-files/linux-libre/5.4-x86_64.conf: Set CONFIG_FONTS=y, CONFIG_FONT_TER16x32=y, and CONFIG_FONT_6x10=y. Tobias Geerinckx-Rice 2019-12-18gnu: linux-libre: Update to 5.4.5....* gnu/packages/aux-files/linux-libre/5.3-arm-veyron.conf, gnu/packages/aux-files/linux-libre/5.3-arm.conf, gnu/packages/aux-files/linux-libre/5.3-arm64.conf, gnu/packages/aux-files/linux-libre/5.3-i686.conf, gnu/packages/aux-files/linux-libre/5.3-x86_64.conf: Delete files. * gnu/packages/aux-files/linux-libre/5.4-arm-veyron.conf, gnu/packages/aux-files/linux-libre/5.4-arm.conf, gnu/packages/aux-files/linux-libre/5.4-arm64.conf, gnu/packages/aux-files/linux-libre/5.4-i686.conf, gnu/packages/aux-files/linux-libre/5.4-x86_64.conf: New files. * Makefile.am (AUX_FILES): Update accordingly. * gnu/packages/patches/linux-libre-active-entropy.patch: Delete file. * gnu/local.mk (dist_patch_DATA): Remove it. * gnu/packages/linux.scm (deblob-scripts-5.3, linux-libre-5.3-version) (linux-libre-5.3-pristine-source, linux-libre-5.3-source) (linux-libre-headers-5.3, linux-libre-5.3): Remove variables. (deblob-scripts-5.4, linux-libre-5.4-version) (linux-libre-5.4-pristine-source, linux-libre-5.4-source) (linux-libre-headers-5.4, linux-libre-5.4): New variables. (linux-libre-version, linux-libre-pristine-source) (linux-libre-source, linux-libre): Point to linux-libre-5.4*. Mark H Weaver 2019-12-18gnu: linux-libre: Remove orphaned 5.2.x kernel configurations....This is a followup to commit 4845dee706a1aee89917e5c7f25d3bce64f7e11c. * gnu/packages/aux-files/linux-libre/5.2-arm-veyron.conf, gnu/packages/aux-files/linux-libre/5.2-arm.conf, gnu/packages/aux-files/linux-libre/5.2-arm64.conf, gnu/packages/aux-files/linux-libre/5.2-i686.conf, gnu/packages/aux-files/linux-libre/5.2-x86_64.conf: Delete files. * Makefile.am (AUX_FILES): Remove them. Mark H Weaver 2019-12-04gnu: emacs: Use load-path instead of EMACSLOADPATH....This enables the use of the subdirs.el feature of Emacs, where specifying a directory in EMACSLOADPATH translates into a `load-path' variable containing the directory and all its sub-directories. * gnu/packages/aux-files/emacs/guix-emacs.el (guix-emacs-autoload-packages): Use `load-path' directly instead of parsing EMACSLOADPATH. Reported-by: Leo Prikler <leo.prikler@student.tugraz.at> Signed-off-by: Clément Lassieur <clement@lassieur.org> Maxim Cournoyer 2019-12-04gnu: emacs: Fix guix-emacs.el indentation....* gnu/packages/aux-files/emacs/guix-emacs.el: Fix indentation. Signed-off-by: Clément Lassieur <clement@lassieur.org> Maxim Cournoyer 2019-11-18gnu: emacs: Adapt the autoloads auxiliary code to use EMACSLOADPATH....The Elisp directories to scan for autoloads are now taken from EMACSLOADPATH instead of from the user profile, environment profile or system profile. Manually adding the Elisp directories to the `load-path' is no longer necessary, as this is covered by Emacs when they are in EMACSLOADPATH. The caching logic is also removed, as this code is not typically run often and the gain is marginal (loading autoloads files is cheap). * gnu/packages/aux-files/emacs/guix-emacs.el (guix-emacs-directory) (guix-emacs-subdirs, guix-emacs-directories): Remove procedures. (guix-emacs-find-autoloads): Filter the directory entries by passing the regexp to `directory-files' directly, which is ten times faster. Remove deduplication. (guix-emacs-autoloads-regexp): Remove the group, which used to filter out the file extension; it no longer works this way due to passing the regexp to the `directory-files' procedure directly, which doesn't care about groups. (guix-emacs-autoload-packages): Update doc. Search package directories from EMACSLOADPATH. Do not populate the load-path. Remove cache. Maxim Cournoyer