[Libosinfo] [libosinfo] Add 'persistent' parameter to OsinfoMedia

Fabiano Fidêncio fidencio at redhat.com
Wed Apr 12 09:09:34 UTC 2017


If media is an installer, thus specifies whether the media should be
persistent accross the final reboot during its installation process.
Default value is false.

This is mainly needed for applications like GNOME Boxes (and maybe
virt-install) to be able to decide whether the media should be ejected
or not when the final reboot happens during its installation process.

The latter case may happen when the installer leaves some packages to be
installed after rebooting the OS for the last time.

The situation this patch solves is a corner-case faced when adding the
install scripts for SLES, as during its installation only one reboot is
performed (so, installer-reboots attribute doesn't help us) and the media
must persist after this reboot in order to finish the installation.

Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
---
 osinfo/libosinfo.syms  |  5 +++++
 osinfo/osinfo_db.c     |  3 +++
 osinfo/osinfo_loader.c |  9 +++++++++
 osinfo/osinfo_media.c  | 49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 osinfo/osinfo_media.h  |  2 ++
 5 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
index 68d54ff..e148d50 100644
--- a/osinfo/libosinfo.syms
+++ b/osinfo/libosinfo.syms
@@ -520,6 +520,11 @@ LIBOSINFO_0.2.12 {
 	osinfo_media_get_volume_size;
 } LIBOSINFO_0.2.11;
 
+LIBOSINFO_0.2.13 {
+    global:
+    osinfo_media_get_persistent;
+} LIBOSINFO_0.2.12;
+
 /* Symbols in next release...
 
   LIBOSINFO_0.0.2 {
diff --git a/osinfo/osinfo_db.c b/osinfo/osinfo_db.c
index cf86ccc..62d54de 100644
--- a/osinfo/osinfo_db.c
+++ b/osinfo/osinfo_db.c
@@ -628,6 +628,7 @@ static void fill_media(OsinfoDb *db, OsinfoMedia *media,
 {
     gboolean is_installer;
     gboolean is_live;
+    gboolean is_persistent;
     gint reboots;
     const gchar *id;
     const gchar *kernel_path;
@@ -663,9 +664,11 @@ static void fill_media(OsinfoDb *db, OsinfoMedia *media,
         g_object_set(G_OBJECT(media), "initrd_path", initrd_path, NULL);
     is_installer = osinfo_media_get_installer(matched_media);
     is_live = osinfo_media_get_live(matched_media);
+    is_persistent = osinfo_media_get_persistent(matched_media);
     g_object_set(G_OBJECT(media),
                  "installer", is_installer,
                  "live", is_live,
+                 "persistent", is_persistent,
                  NULL);
     if (is_installer) {
         reboots = osinfo_media_get_installer_reboots(matched_media);
diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
index dba567f..d4c811a 100644
--- a/osinfo/osinfo_loader.c
+++ b/osinfo/osinfo_loader.c
@@ -1050,6 +1050,8 @@ static OsinfoMedia *osinfo_loader_media(OsinfoLoader *loader,
     xmlChar *installer = xmlGetProp(root, BAD_CAST OSINFO_MEDIA_PROP_INSTALLER);
     xmlChar *installer_reboots =
             xmlGetProp(root, BAD_CAST OSINFO_MEDIA_PROP_INSTALLER_REBOOTS);
+    xmlChar *persistent =
+            xmlGetProp(root, BAD_CAST OSINFO_MEDIA_PROP_PERSISTENT);
     const OsinfoEntityKey keys[] = {
         { OSINFO_MEDIA_PROP_URL, G_TYPE_STRING },
         { OSINFO_MEDIA_PROP_KERNEL, G_TYPE_STRING },
@@ -1082,6 +1084,13 @@ static OsinfoMedia *osinfo_loader_media(OsinfoLoader *loader,
         xmlFree(installer_reboots);
     }
 
+    if (persistent) {
+        osinfo_entity_set_param(OSINFO_ENTITY(media),
+                                OSINFO_MEDIA_PROP_PERSISTENT,
+                                (gchar *)persistent);
+        xmlFree(persistent);
+    }
+
     gint nnodes = osinfo_loader_nodeset("./variant", loader, ctxt, &nodes, err);
     if (error_is_set(err)) {
         g_object_unref(media);
diff --git a/osinfo/osinfo_media.c b/osinfo/osinfo_media.c
index af4bb14..eac48a8 100644
--- a/osinfo/osinfo_media.c
+++ b/osinfo/osinfo_media.c
@@ -156,7 +156,8 @@ enum {
     PROP_INSTALLER_REBOOTS,
     PROP_OS,
     PROP_LANGUAGES,
-    PROP_VOLUME_SIZE
+    PROP_VOLUME_SIZE,
+    PROP_PERSISTENT
 };
 
 static void
@@ -236,6 +237,11 @@ osinfo_media_get_property(GObject    *object,
                           osinfo_media_get_volume_size(media));
         break;
 
+    case PROP_PERSISTENT:
+        g_value_set_boolean(value,
+                            osinfo_media_get_persistent(media));
+        break;
+
     default:
         /* We don't have any other property... */
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
@@ -332,6 +338,12 @@ osinfo_media_set_property(GObject      *object,
                                       g_value_get_int64(value));
         break;
 
+    case PROP_PERSISTENT:
+        osinfo_entity_set_param_boolean(OSINFO_ENTITY(media),
+                                        OSINFO_MEDIA_PROP_PERSISTENT,
+                                        g_value_get_boolean(value));
+
+        break;
     default:
         /* We don't have any other property... */
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
@@ -574,6 +586,24 @@ osinfo_media_class_init(OsinfoMediaClass *klass)
                                G_PARAM_READWRITE |
                                G_PARAM_STATIC_STRINGS);
     g_object_class_install_property(g_klass, PROP_VOLUME_SIZE, pspec);
+
+    /**
+     * OsinfoMedia:persistent:
+     *
+     * Whether the media should be persistent accross reboots done during
+     * the installation process.
+     *
+     * Some distros need their media to be persistent accross reboots as some
+     * packages are installed after the reboot (which may cause the media
+     * ejection, depending on the application).
+     */
+    pspec = g_param_spec_boolean("persistent",
+                                 "Persistent",
+                                 _("The media persists reboots during its installation process"),
+                                 FALSE /* default value */,
+                                 G_PARAM_READWRITE |
+                                 G_PARAM_STATIC_STRINGS);
+    g_object_class_install_property(g_klass, PROP_PERSISTENT, pspec);
 }
 
 static void
@@ -1269,6 +1299,21 @@ gint64 osinfo_media_get_volume_size(OsinfoMedia *media)
         (OSINFO_ENTITY(media), OSINFO_MEDIA_PROP_VOLUME_SIZE, -1);
 }
 
+/**
+ * osinfo_media_get_persistent:
+ * @media: an #OsinfoMedia instance
+ *
+ * Whether @media should persist accross reboots done during its installation
+ * process.
+ *
+ * Returns: #TRUE if media should persist, #FALSE otherwise
+ */
+gboolean osinfo_media_get_persistent(OsinfoMedia *media)
+{
+    return osinfo_entity_get_param_value_boolean_with_default
+            (OSINFO_ENTITY(media), OSINFO_MEDIA_PROP_PERSISTENT, FALSE);
+}
+
 /*
  * Local variables:
  *  indent-tabs-mode: nil
@@ -1276,3 +1321,5 @@ gint64 osinfo_media_get_volume_size(OsinfoMedia *media)
  *  c-basic-offset: 4
  * End:
  */
+
+
diff --git a/osinfo/osinfo_media.h b/osinfo/osinfo_media.h
index 09fbacd..b400fb5 100644
--- a/osinfo/osinfo_media.h
+++ b/osinfo/osinfo_media.h
@@ -90,6 +90,7 @@ typedef struct _OsinfoMediaPrivate OsinfoMediaPrivate;
 #define OSINFO_MEDIA_PROP_LANG_MAP       "l10n-language-map"
 #define OSINFO_MEDIA_PROP_VARIANT        "variant"
 #define OSINFO_MEDIA_PROP_VOLUME_SIZE    "volume-size"
+#define OSINFO_MEDIA_PROP_PERSISTENT     "persistent"
 
 /* object */
 struct _OsinfoMedia
@@ -140,6 +141,7 @@ gboolean osinfo_media_get_installer(OsinfoMedia *media);
 gboolean osinfo_media_get_live(OsinfoMedia *media);
 gint osinfo_media_get_installer_reboots(OsinfoMedia *media);
 gint64 osinfo_media_get_volume_size(OsinfoMedia *media);
+gboolean osinfo_media_get_persistent(OsinfoMedia *media);
 
 #endif /* __OSINFO_MEDIA_H__ */
 /*
-- 
2.9.3




More information about the Libosinfo mailing list