unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
From: zerodaysfordays@sdf.lonestar.org (Jakob L. Kreuze)
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: 36404@debbugs.gnu.org
Subject: [bug#36404] [PATCH 1/3] guix system: Add 'reconfigure' module.
Date: Fri, 05 Jul 2019 19:46:44 -0400	[thread overview]
Message-ID: <877e8wf3iz.fsf_-_@sdf.lonestar.org> (raw)
In-Reply-To: <87bly8f3kq.fsf_-_@sdf.lonestar.org> (Jakob L. Kreuze's message of "Fri, 05 Jul 2019 19:45:41 -0400")

[-- Attachment #1: Type: text/plain, Size: 8821 bytes --]

* guix/scripts/system/reconfigure.scm: New file.
* Makefile.am (MODULES): Add it.
* guix/scripts/system.scm (bootloader-installer-script): Export variable.
---
 Makefile.am                         |   1 +
 guix/scripts/system.scm             |   1 +
 guix/scripts/system/reconfigure.scm | 157 ++++++++++++++++++++++++++++
 3 files changed, 159 insertions(+)
 create mode 100644 guix/scripts/system/reconfigure.scm

diff --git a/Makefile.am b/Makefile.am
index 4d3024e58..1934a21b1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -245,6 +245,7 @@ MODULES =					\
   guix/scripts/describe.scm			\
   guix/scripts/system.scm			\
   guix/scripts/system/search.scm		\
+  guix/scripts/system/reconfigure.scm		\
   guix/scripts/lint.scm				\
   guix/scripts/challenge.scm			\
   guix/scripts/import/crate.scm			\
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index 60c1ca5c9..21858ee7d 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -70,6 +70,7 @@
   #:use-module (ice-9 match)
   #:use-module (rnrs bytevectors)
   #:export (guix-system
+            bootloader-installer-script
             read-operating-system))
 
 \f
diff --git a/guix/scripts/system/reconfigure.scm b/guix/scripts/system/reconfigure.scm
new file mode 100644
index 000000000..f4ca6b4b1
--- /dev/null
+++ b/guix/scripts/system/reconfigure.scm
@@ -0,0 +1,157 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2019 Jakob L. Kreuze <zerodaysfordays@sdf.lonestar.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 (guix scripts system reconfigure)
+  #:autoload   (gnu packages gnupg) (guile-gcrypt)
+  #:use-module (guix gexp)
+  #:use-module (guix modules)
+  #:export (switch-to-system
+            upgrade-shepherd-services
+            install-bootloader))
+
+;;; Commentary:
+;;;
+;;; This module implements the "effectful" parts of system
+;;; reconfiguration. Although building a system derivation is a pure
+;;; operation, a number of impure operations must be carried out for the
+;;; system configuration to be realized -- chiefly, creation of generation
+;;; symlinks and invocation of activation scripts.
+;;;
+;;; Code:
+
+(define (switch-to-system system-derivation activation-script)
+  "Return a G-Expression that, upon being evaluated, will create a new
+generation for SYSTEM-DERIVATION and execute ACTIVATION-SCRIPT."
+  (with-extensions (list guile-gcrypt)
+    (with-imported-modules (source-module-closure '((guix config)
+                                                    (guix profiles)
+                                                    (guix utils)))
+      #~(begin
+          (use-modules (guix config)
+                       (guix profiles)
+                       (guix utils))
+
+          (define %system-profile
+            (string-append %state-directory "/profiles/system"))
+
+          (let* ((system #$system-derivation)
+                 (number (1+ (generation-number %system-profile)))
+                 (generation (generation-file-name %system-profile number)))
+            (switch-symlinks generation system)
+            (switch-symlinks %system-profile generation)
+            ;; The implementation of 'guix system reconfigure' saves the
+            ;; load path and environment here. This is unnecessary here
+            ;; because each invocation of 'remote-eval' runs in a distinct
+            ;; Guile REPL.
+            (setenv "GUIX_NEW_SYSTEM" system)
+            ;; The activation script may write to stdout, which confuses
+            ;; 'remote-eval' when it attempts to read a result from the
+            ;; remote REPL. We work around this by forcing the output to a
+            ;; string.
+            (with-output-to-string
+              (lambda ()
+                (primitive-load #$activation-script))))))))
+
+;; XXX: Currently, this does NOT attempt to restart running services. See
+;; <https://issues.guix.info/issue/33508> for details.
+(define (upgrade-shepherd-services target-services)
+  "Return a G-Expression that, upon being evaluated, will use TARGET-SERVICES,
+a list of (shepherd-service-canonical-name, shepherd-service-file) pairs to
+determine which services are obsolete and need to be unloaded, as well as
+which services are new and need to be started."
+  (with-imported-modules '((gnu services herd))
+    #~(begin
+        (use-modules (gnu services herd)
+                     (srfi srfi-1))
+
+        (define running
+          (filter live-service-running (current-services)))
+
+        (define (essential? service)
+          ;; Return #t if SERVICE is essential and should not be unloaded
+          ;; under any circumstance.
+          (memq (first (live-service-provision service))
+                '(root shepherd)))
+
+        (define (obsolete? service)
+          ;; Return #t if SERVICE can be safely unloaded.
+          (and (not (essential? service))
+               (every (lambda (requirements)
+                        (not (memq (first (live-service-provision service))
+                                   requirements)))
+                      (map live-service-requirement running))))
+
+        (define to-unload
+          (filter obsolete?
+                  (remove (lambda (service)
+                            (memq (first (live-service-provision service))
+                                  (map first '#$target-services)))
+                          running)))
+
+        (define to-start
+          (remove (lambda (service-pair)
+                    (memq (first service-pair)
+                          (map (compose first live-service-provision)
+                               running)))
+                  '#$target-services))
+
+        ;; Unload obsolete services.
+        (for-each (lambda (service)
+                    (false-if-exception
+                     (unload-service service)))
+                  to-unload)
+
+        ;; Load the service files for any new services and start them.
+        (load-services/safe (map second to-start))
+        (for-each start-service (map first to-start)))))
+
+(define (install-bootloader installer-script bootcfg bootcfg-file target)
+  "Return a G-Expression that, upon being evaluated, will install BOOTCFG to
+BOOTCFG-FILE, a target path, on TARGET, a mount point, and subsequently run
+INSTALLER-SCRIPT."
+  (with-extensions (list guile-gcrypt)
+    (with-imported-modules (source-module-closure '((gnu build install)
+                                                    (guix store)
+                                                    (guix utils)))
+      #~(begin
+          (use-modules (gnu build install)
+                       (guix store)
+                       (guix utils))
+          (let* ((gc-root (string-append "/" %gc-roots-directory "/bootcfg"))
+                 (temp-gc-root (string-append gc-root ".new")))
+
+            (switch-symlinks temp-gc-root gc-root)
+
+            (unless (false-if-exception
+                     (begin
+                       ;; The implementation of 'guix system reconfigure'
+                       ;; saves the load path here. This is unnecessary here
+                       ;; because each invocation of 'remote-eval' runs in a
+                       ;; distinct Guile REPL.
+                       (install-boot-config #$bootcfg #$bootcfg-file #$target)
+                       ;; The installation script may write to stdout, which
+                       ;; confuses 'remote-eval' when it attempts to read a
+                       ;; result from the remote REPL. We work around this
+                       ;; by forcing the output to a string.
+                       (with-output-to-string
+                         (lambda ()
+                           (primitive-load #$installer-script)))))
+              (delete-file temp-gc-root)
+              (error "failed to install bootloader"))
+
+            (rename-file temp-gc-root gc-root))))))
-- 
2.22.0


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

  reply	other threads:[~2019-07-05 23:48 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-27 18:35 [bug#36404] [PATCH 0/6] Add 'guix deploy' Jakob L. Kreuze
2019-06-27 18:38 ` [bug#36404] [PATCH 1/6] Take another stab at this whole guix deploy thing Jakob L. Kreuze
2019-06-27 18:39   ` [bug#36404] [PATCH 2/6] ssh: Add 'identity' keyword to 'open-ssh-session' Jakob L. Kreuze
2019-06-27 18:40     ` [bug#36404] [PATCH 3/6] gnu: Add machine type for deployment specifications Jakob L. Kreuze
2019-06-27 18:40       ` [bug#36404] [PATCH 4/6] Export the (gnu machine) interface Jakob L. Kreuze
2019-06-27 18:41         ` [bug#36404] [PATCH 5/6] Add 'guix deploy' Jakob L. Kreuze
2019-06-27 18:42           ` [bug#36404] [PATCH 6/6] doc: Add section for " Jakob L. Kreuze
2019-06-29 21:43             ` Christopher Lemmer Webber
2019-06-30  0:35               ` Jakob L. Kreuze
2019-06-29 21:38           ` [bug#36404] [PATCH 5/6] Add " Christopher Lemmer Webber
2019-06-29 21:36         ` [bug#36404] [PATCH 4/6] Export the (gnu machine) interface Christopher Lemmer Webber
2019-06-29 22:04         ` Ricardo Wurmus
2019-06-30  0:41           ` Jakob L. Kreuze
2019-06-27 20:05 ` [bug#36404] [PATCH 0/6] Add 'guix deploy' Thompson, David
2019-06-28 13:34   ` [bug#36404] [PATCH 0/5] " Jakob L. Kreuze
2019-06-28 13:35     ` [bug#36404] [PATCH 1/5] ssh: Add 'identity' keyword to 'open-ssh-session' Jakob L. Kreuze
2019-06-28 13:35       ` [bug#36404] [PATCH 2/5] gnu: Add machine type for deployment specifications Jakob L. Kreuze
2019-06-28 13:36         ` [bug#36404] [PATCH 3/5] Add 'guix deploy' Jakob L. Kreuze
2019-06-28 13:37           ` [bug#36404] [PATCH 4/5] Export the (gnu machine) interface Jakob L. Kreuze
2019-06-28 13:37             ` [bug#36404] [PATCH 5/5] doc: Add section for 'guix deploy' Jakob L. Kreuze
2019-06-29 21:36         ` [bug#36404] [PATCH 2/5] gnu: Add machine type for deployment specifications Christopher Lemmer Webber
2019-06-30  0:30           ` Jakob L. Kreuze
2019-06-30  4:58             ` Carlo Zancanaro
2019-06-30 12:34               ` Christopher Lemmer Webber
2019-07-01 23:51                 ` Jakob L. Kreuze
2019-07-04 12:48                   ` Christopher Lemmer Webber
2019-07-04 16:05                     ` Jakob L. Kreuze
2019-06-30 12:28             ` Christopher Lemmer Webber
2019-07-02  0:03               ` Jakob L. Kreuze
2019-06-29 14:42       ` [bug#36404] [PATCH 1/5] ssh: Add 'identity' keyword to 'open-ssh-session' Christopher Lemmer Webber
2019-06-29 23:45         ` Jakob L. Kreuze
2019-06-29 14:37 ` [bug#36404] [PATCH 0/6] Add 'guix deploy' Christopher Lemmer Webber
2019-06-29 23:42   ` Jakob L. Kreuze
2019-07-01 12:50     ` Ludovic Courtès
2019-07-01 10:09   ` Ricardo Wurmus
2019-07-01 12:53   ` Ludovic Courtès
2019-07-02  0:10     ` Jakob L. Kreuze
2019-07-02 22:14       ` Jakob L. Kreuze
2019-07-04 16:48         ` Jakob L. Kreuze
2019-07-05  8:00           ` Ludovic Courtès
2019-07-05 23:45             ` [bug#36404] [PATCH 0/3] Refactor out common behavior for system reconfiguration Jakob L. Kreuze
2019-07-05 23:46               ` Jakob L. Kreuze [this message]
2019-07-05 23:47                 ` [bug#36404] [PATCH 2/3] machine: Reimplement 'managed-host-environment-type' deployment Jakob L. Kreuze
2019-07-05 23:48                   ` [bug#36404] [PATCH 3/3] guix system: Reimplement 'reconfigure' Jakob L. Kreuze
2019-07-06 22:20                     ` Ludovic Courtès
2019-07-06 22:13                   ` [bug#36404] [PATCH 2/3] machine: Reimplement 'managed-host-environment-type' deployment Ludovic Courtès
2019-07-07  7:13                   ` Christopher Lemmer Webber
2019-07-07 13:05                     ` Ludovic Courtès
2019-07-06 22:11                 ` [bug#36404] [PATCH 1/3] guix system: Add 'reconfigure' module Ludovic Courtès
2019-07-06 22:02               ` [bug#36404] [PATCH 0/3] Refactor out common behavior for system reconfiguration Ludovic Courtès
2019-07-07  7:02               ` Christopher Lemmer Webber
2019-07-07 13:06                 ` Ludovic Courtès
2019-07-08 19:22                   ` Jakob L. Kreuze
2019-07-02  0:14     ` [bug#36404] [PATCH 0/4] Add 'guix deploy' Jakob L. Kreuze
2019-07-02  0:16       ` [bug#36404] [PATCH 1/4] ssh: Add 'identity' keyword to 'open-ssh-session' Jakob L. Kreuze
2019-07-02  0:17         ` [bug#36404] [PATCH 2/4] gnu: Add machine type for deployment specifications Jakob L. Kreuze
2019-07-02  0:17           ` [bug#36404] [PATCH 3/4] Add 'guix deploy' Jakob L. Kreuze
2019-07-02  0:18             ` [bug#36404] [PATCH 4/4] doc: Add section for " Jakob L. Kreuze
     [not found]               ` <875zoldqah.fsf@kyleam.com>
     [not found]                 ` <87muhwtmfp.fsf@sdf.lonestar.org>
     [not found]                   ` <871rz874l2.fsf@kyleam.com>
     [not found]                     ` <877e90tj7l.fsf_-_@sdf.lonestar.org>
2019-07-02 17:56                       ` [bug#36404] [PATCH v4 1/4] ssh: Add 'identity' keyword to 'open-ssh-session' Jakob L. Kreuze
2019-07-02 17:56                         ` [bug#36404] [PATCH v4 2/4] gnu: Add machine type for deployment specifications Jakob L. Kreuze
2019-07-02 17:57                           ` [bug#36404] [PATCH v4 3/4] Add 'guix deploy' Jakob L. Kreuze
2019-07-02 17:58                             ` [bug#36404] [PATCH v4 4/4] doc: Add section for " Jakob L. Kreuze
2019-07-03 23:07                               ` Christopher Lemmer Webber
2019-07-04  9:20                                 ` Ludovic Courtès
2019-07-05  1:39                               ` Thompson, David
2019-07-05  8:29                               ` Ludovic Courtès
2019-07-05  1:35                             ` [bug#36404] [PATCH v4 3/4] Add " Thompson, David
2019-07-05  8:17                             ` Ludovic Courtès
2019-07-04  9:19                           ` [bug#36404] [PATCH v4 2/4] gnu: Add machine type for deployment specifications Ludovic Courtès
2019-07-04 15:59                             ` Jakob L. Kreuze
2019-07-05  1:32                           ` Thompson, David
2019-07-05  8:10                             ` Ludovic Courtès
2019-07-05  8:24                           ` Ludovic Courtès
2019-07-05 18:53                             ` [bug#36404] [PATCH v5 0/4] Add 'guix deploy' Jakob L. Kreuze
2019-07-05 18:54                               ` [bug#36404] [PATCH v5 1/4] ssh: Add 'identity' keyword to 'open-ssh-session' Jakob L. Kreuze
2019-07-05 18:55                                 ` [bug#36404] [PATCH v5 2/4] gnu: Add machine type for deployment specifications Jakob L. Kreuze
2019-07-05 18:56                                   ` [bug#36404] [PATCH v5 3/4] Add 'guix deploy' Jakob L. Kreuze
2019-07-05 18:57                                     ` [bug#36404] [PATCH v5 4/4] doc: Add section for " Jakob L. Kreuze
2019-07-06  6:14                                       ` bug#36404: " Christopher Lemmer Webber
2019-07-05 23:25                                         ` [bug#36404] " Jakob L. Kreuze
2019-07-06 21:50                                         ` Ludovic Courtès
2019-07-05  1:23                         ` [bug#36404] [PATCH v4 1/4] ssh: Add 'identity' keyword to 'open-ssh-session' Thompson, David
2019-07-01 12:48 ` [bug#36404] [PATCH 0/6] Add 'guix deploy' Ludovic Courtès
2019-07-05 10:32 ` [bug#36404] [PATCH v4 2/4] gnu: Add machine type for deployment specifications Christopher Lemmer Webber

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=877e8wf3iz.fsf_-_@sdf.lonestar.org \
    --to=zerodaysfordays@sdf.lonestar.org \
    --cc=36404@debbugs.gnu.org \
    --cc=ludo@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).