Refactor: Centralise choosing the appropriate bootloader
authorWilliam Manley <will@stb-tester.com>
Mon, 6 Jul 2020 13:54:31 +0000 (14:54 +0100)
committerWilliam Manley <will@stb-tester.com>
Mon, 26 Oct 2020 23:51:11 +0000 (23:51 +0000)
In preparation for enhancing `_ostree_sysroot_query_bootloader`

src/libostree/ostree-sysroot-deploy.c
src/libostree/ostree-sysroot.c

index 1a4a63699c042ea788eddf7fd463df9df61f648d..900efe49976b1236b7b380cc09ef73ae21f542f4 100644 (file)
@@ -44,7 +44,6 @@
 #include "ostree-repo-private.h"
 #include "ostree-sysroot-private.h"
 #include "ostree-sepolicy-private.h"
-#include "ostree-bootloader-zipl.h"
 #include "ostree-deployment-private.h"
 #include "ostree-core-private.h"
 #include "ostree-linuxfsutil.h"
@@ -2561,7 +2560,6 @@ ostree_sysroot_write_deployments_with_options (OstreeSysroot     *self,
   gboolean bootloader_is_atomic = FALSE;
   SyncStats syncstats = { 0, };
   g_autoptr(OstreeBootloader) bootloader = NULL;
-  const char *bootloader_config = NULL;
   if (!requires_new_bootversion)
     {
       if (!create_new_bootlinks (self, self->bootversion,
@@ -2593,29 +2591,8 @@ ostree_sysroot_write_deployments_with_options (OstreeSysroot     *self,
             return glnx_throw_errno_prefix (error, "Remounting /boot read-write");
         }
 
-      OstreeRepo *repo = ostree_sysroot_repo (self);
-
-      bootloader_config = ostree_repo_get_bootloader (repo);
-
-      g_debug ("Using bootloader configuration: %s", bootloader_config);
-
-      if (g_str_equal (bootloader_config, "auto"))
-        {
-          if (!_ostree_sysroot_query_bootloader (self, &bootloader, cancellable, error))
-            return FALSE;
-        }
-      else if (g_str_equal (bootloader_config, "none"))
-        {
-          /* No bootloader specified; do not query bootloaders to run. */
-        }
-      else if (g_str_equal (bootloader_config, "zipl"))
-        {
-          /* Because we do not mark zipl as active by default, lets creating one here,
-           * which is basically the same what _ostree_sysroot_query_bootloader() does
-           * for other bootloaders if being activated.
-           * */
-          bootloader = (OstreeBootloader*) _ostree_bootloader_zipl_new (self);
-        }
+      if (!_ostree_sysroot_query_bootloader (self, &bootloader, cancellable, error))
+        return FALSE;
 
       bootloader_is_atomic = bootloader != NULL && _ostree_bootloader_is_atomic (bootloader);
 
@@ -2646,6 +2623,7 @@ ostree_sysroot_write_deployments_with_options (OstreeSysroot     *self,
                        (bootloader_is_atomic ? "Transaction complete" : "Bootloader updated"),
                        requires_new_bootversion ? "yes" : "no",
                        new_deployments->len - self->deployments->len);
+    const gchar *bootloader_config = ostree_repo_get_bootloader (ostree_sysroot_repo (self));
     ot_journal_send ("MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(OSTREE_DEPLOYMENT_COMPLETE_ID),
                      "MESSAGE=%s", msg,
                      "OSTREE_BOOTLOADER=%s", bootloader ? _ostree_bootloader_get_name (bootloader) : "none",
index e0813b554432b1443bc740c44e825f1def6e0c60..f183edd1cf94461058cfb3a1be100585c9370e7f 100644 (file)
@@ -36,6 +36,7 @@
 #include "ostree-bootloader-uboot.h"
 #include "ostree-bootloader-syslinux.h"
 #include "ostree-bootloader-grub2.h"
+#include "ostree-bootloader-zipl.h"
 
 /**
  * SECTION:ostree-sysroot
@@ -1328,6 +1329,7 @@ ostree_sysroot_repo (OstreeSysroot *self)
  * ostree_sysroot_query_bootloader:
  * @sysroot: Sysroot
  * @out_bootloader: (out) (transfer full) (allow-none): Return location for bootloader, may be %NULL
+ * @out_bootloader_config: (out) (transfer none) (allow-none): Return location for value of ostree repo config variable sysroot.bootloader, may be %NULL
  * @cancellable: Cancellable
  * @error: Error
  */
@@ -1337,30 +1339,51 @@ _ostree_sysroot_query_bootloader (OstreeSysroot     *sysroot,
                                   GCancellable      *cancellable,
                                   GError           **error)
 {
-  gboolean is_active;
-  g_autoptr(OstreeBootloader) ret_loader =
-    (OstreeBootloader*)_ostree_bootloader_syslinux_new (sysroot);
-  if (!_ostree_bootloader_query (ret_loader, &is_active,
-                                 cancellable, error))
-    return FALSE;
+  OstreeRepo *repo = ostree_sysroot_repo (sysroot);
+  g_autofree gchar *bootloader_config = ostree_repo_get_bootloader (repo);
+
+  g_debug ("Using bootloader configuration: %s", bootloader_config);
 
-  if (!is_active)
+  g_autoptr(OstreeBootloader) ret_loader = NULL;
+  if (g_str_equal (bootloader_config, "none"))
     {
-      g_object_unref (ret_loader);
-      ret_loader = (OstreeBootloader*)_ostree_bootloader_grub2_new (sysroot);
-      if (!_ostree_bootloader_query (ret_loader, &is_active,
-                                     cancellable, error))
-        return FALSE;
+      /* No bootloader specified; do not query bootloaders to run. */
+      ret_loader = NULL;
     }
-  if (!is_active)
+  else if (g_str_equal (bootloader_config, "zipl"))
     {
-      g_object_unref (ret_loader);
-      ret_loader = (OstreeBootloader*)_ostree_bootloader_uboot_new (sysroot);
-      if (!_ostree_bootloader_query (ret_loader, &is_active, cancellable, error))
+      /* We never consider zipl as active by default, so it can only be created
+       * if it's explicitly requested in the config */
+      ret_loader = (OstreeBootloader*) _ostree_bootloader_zipl_new (sysroot);
+    }
+  else if (g_str_equal (bootloader_config, "auto"))
+    {
+      gboolean is_active;
+      ret_loader = (OstreeBootloader*)_ostree_bootloader_syslinux_new (sysroot);
+      if (!_ostree_bootloader_query (ret_loader, &is_active,
+                                     cancellable, error))
         return FALSE;
+
+      if (!is_active)
+        {
+          g_object_unref (ret_loader);
+          ret_loader = (OstreeBootloader*)_ostree_bootloader_grub2_new (sysroot);
+          if (!_ostree_bootloader_query (ret_loader, &is_active,
+                                         cancellable, error))
+            return FALSE;
+        }
+      if (!is_active)
+        {
+          g_object_unref (ret_loader);
+          ret_loader = (OstreeBootloader*)_ostree_bootloader_uboot_new (sysroot);
+          if (!_ostree_bootloader_query (ret_loader, &is_active, cancellable, error))
+            return FALSE;
+        }
+      if (!is_active)
+        g_clear_object (&ret_loader);
     }
-  if (!is_active)
-    g_clear_object (&ret_loader);
+  else
+    g_assert_not_reached ();
 
   ot_transfer_out_value(out_bootloader, &ret_loader);
   return TRUE;