[virt-tools-list] [PATCH 2/2] install script: add config_param entity

Fabiano Fidêncio fabiano at fidencio.org
Mon Aug 13 07:37:37 UTC 2012


Now we need to set what are the configs that will be used in each
script. To set it, just add, in the .xml's script file:
<config>
  <param name="..." policy="mandatory"|"optional"/>
</config>

For manage these configs, a new entity was created, called:
OsinfoInstallConfigParam. And the OsinfoInstallScript entity is, now,
keeping an internal list of the OsinfoInstallConfigParam entity.

With these changes, applications that uses/will use libosinfo can check
if an install script has some config to be set using, consulting by:
- ConfigParam entity:
osinfo_install_script_has_config_param(OsinfoInstallScript *script,
                        const OsinfoInstallConfigParameter config_param);

- Parameter name:
osinfo_install_script_has_config_param_name(OsinfoInstallScript *script,
                                            const gchar* name);
---
 data/install-scripts/fedora.xml           |   6 +
 data/install-scripts/windows-sif.xml      |   5 +
 data/install-scripts/windows-unattend.xml |   9 ++
 data/schemas/libosinfo.rng                |  12 ++
 docs/reference/Libosinfo.types            |   1 +
 osinfo/Makefile.am                        |   1 +
 osinfo/libosinfo.syms                     |   8 +
 osinfo/osinfo.h                           |   1 +
 osinfo/osinfo_install_config_param.c      | 234 ++++++++++++++++++++++++++++++
 osinfo/osinfo_install_config_param.h      |  83 +++++++++++
 osinfo/osinfo_install_script.c            |  49 ++++++-
 osinfo/osinfo_install_script.h            |  12 +-
 osinfo/osinfo_loader.c                    |  36 +++++
 13 files changed, 455 insertions(+), 2 deletions(-)
 create mode 100644 osinfo/osinfo_install_config_param.c
 create mode 100644 osinfo/osinfo_install_config_param.h

diff --git a/data/install-scripts/fedora.xml b/data/install-scripts/fedora.xml
index 338a570..a608cdb 100644
--- a/data/install-scripts/fedora.xml
+++ b/data/install-scripts/fedora.xml
@@ -1,6 +1,12 @@
 <libosinfo version="0.0.1">
   <install-script id='http://fedoraproject.org/scripts/fedora/jeos'>
     <profile>jeos</profile>
+    <config>
+      <param name="admin-password" policy="optional"/>
+      <param name="l10n-keyboard" policy="optional"/>
+      <param name="l10n-language" policy="optional"/>
+      <param name="l10n-timezone" policy="optional"/>
+    </config>
     <template filename="fedora.ks">
       <xsl:stylesheet
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
diff --git a/data/install-scripts/windows-sif.xml b/data/install-scripts/windows-sif.xml
index 46b24ae..77fc2c5 100644
--- a/data/install-scripts/windows-sif.xml
+++ b/data/install-scripts/windows-sif.xml
@@ -1,6 +1,11 @@
 <libosinfo version="0.0.1">
   <install-script id='http://microsoft.com/windows/sif'>
     <profile>jeos</profile>
+    <config>
+      <param name="admin-password" policy="optional"/>
+      <param name="reg-product-key" policy="required"/>
+      <param name="user-realname" policy="required"/>
+    </config>
     <template filename="windows.sif">
       <xsl:stylesheet
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
diff --git a/data/install-scripts/windows-unattend.xml b/data/install-scripts/windows-unattend.xml
index 20e3e23..5698bc8 100644
--- a/data/install-scripts/windows-unattend.xml
+++ b/data/install-scripts/windows-unattend.xml
@@ -1,6 +1,15 @@
 <libosinfo version="0.0.1">
   <install-script id='http://microsoft.com/windows/unattend'>
     <profile>jeos</profile>
+    <config>
+      <param name="admin-password" policy="optional"/>
+      <param name="hardware-arch" policy="optional"/>
+      <param name="l10n-language" policy="optional"/>
+      <param name="user-login" policy="optional"/>
+      <param name="user-password" policy="optional"/>
+      <param name="user-realname" policy="optional"/>
+      <param name="reg-product-key" policy="required"/>
+    </config>
     <template filename="windows.xml">
       <xsl:stylesheet
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
diff --git a/data/schemas/libosinfo.rng b/data/schemas/libosinfo.rng
index 7c8d7f7..1392f74 100644
--- a/data/schemas/libosinfo.rng
+++ b/data/schemas/libosinfo.rng
@@ -410,6 +410,12 @@
       <element name='profile'>
         <text/>
       </element>
+      <element name='config'>
+        <attribute name="name"/>
+        <attribute name="policy">
+          <ref name='policies'/>
+        </attribute>
+      </element>
       <element name='product-key-format'>
         <text/>
       </element>
@@ -479,4 +485,10 @@
       <param name="pattern">\w+://.*</param>
     </data>
   </define>
+
+  <define name='policies'>
+    <data type="string">
+      <param name="pattern">required|optional</param>
+    </data>
+  </define>
 </grammar>
diff --git a/docs/reference/Libosinfo.types b/docs/reference/Libosinfo.types
index faf8643..8744ee6 100644
--- a/docs/reference/Libosinfo.types
+++ b/docs/reference/Libosinfo.types
@@ -9,6 +9,7 @@ osinfo_devicelist_get_type
 osinfo_entity_get_type
 osinfo_filter_get_type
 osinfo_install_config_get_type
+osinfo_install_config_param_get_type
 osinfo_install_script_get_type
 osinfo_install_scriptlist_get_type
 osinfo_list_get_type
diff --git a/osinfo/Makefile.am b/osinfo/Makefile.am
index f4aea47..68c4172 100644
--- a/osinfo/Makefile.am
+++ b/osinfo/Makefile.am
@@ -89,6 +89,7 @@ libosinfo_1_0_la_SOURCES =	\
   osinfo_devicelinklist.c	\
   osinfo_devicelinkfilter.c	\
   osinfo_install_config.c       \
+  osinfo_install_config_param.c \
   osinfo_install_script.c       \
   osinfo_install_scriptlist.c   \
   osinfo_product.c		\
diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
index ddf736e..1e55d0e 100644
--- a/osinfo/libosinfo.syms
+++ b/osinfo/libosinfo.syms
@@ -264,6 +264,8 @@ LIBOSINFO_0.2.0 {
 	osinfo_install_config_set_user_administrator;
 	osinfo_install_config_set_user_autologin;
 	osinfo_install_config_set_hostname;
+	osinfo_install_config_param_get_type;
+	osinfo_install_config_param_new;
 	osinfo_install_script_set_output_prefix;
 	osinfo_install_script_get_type;
 	osinfo_install_script_new;
@@ -276,12 +278,18 @@ LIBOSINFO_0.2.0 {
 	osinfo_install_script_generate_output_async;
 	osinfo_install_script_get_profile;
 	osinfo_install_script_get_uri;
+	osinfo_install_script_has_config_param;
+	osinfo_install_script_has_config_param_name;
+	osinfo_install_script_get_config_param_list;
 	osinfo_install_scriptlist_new;
 	osinfo_install_scriptlist_new_filtered;
 	osinfo_install_scriptlist_new_union;
 	osinfo_install_scriptlist_new_intersection;
 	osinfo_install_scriptlist_new_copy;
 	osinfo_install_scriptlist_get_type;
+	osinfo_install_config_param_new;
+	osinfo_install_config_param_get_name;
+	osinfo_install_config_param_get_policy;
 	osinfo_db_get_install_script;
 	osinfo_db_add_install_script;
 	osinfo_db_get_install_script_list;
diff --git a/osinfo/osinfo.h b/osinfo/osinfo.h
index aa06095..204569b 100644
--- a/osinfo/osinfo.h
+++ b/osinfo/osinfo.h
@@ -34,6 +34,7 @@
 #include <osinfo/osinfo_devicelinklist.h>
 #include <osinfo/osinfo_devicelinkfilter.h>
 #include <osinfo/osinfo_install_config.h>
+#include <osinfo/osinfo_install_config_param.h>
 #include <osinfo/osinfo_install_script.h>
 #include <osinfo/osinfo_install_scriptlist.h>
 #include <osinfo/osinfo_productlist.h>
diff --git a/osinfo/osinfo_install_config_param.c b/osinfo/osinfo_install_config_param.c
new file mode 100644
index 0000000..8a0ab56
--- /dev/null
+++ b/osinfo/osinfo_install_config_param.c
@@ -0,0 +1,234 @@
+/*
+ * libosinfo:
+ *
+ * Copyright (C) 2009-2012 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Authors:
+ *   Fabiano Fidêncio <fabiano at fidencio.org>
+ */
+
+#include <config.h>
+
+#include <osinfo/osinfo.h>
+
+G_DEFINE_TYPE (OsinfoInstallConfigParam, osinfo_install_config_param, OSINFO_TYPE_ENTITY);
+
+#define OSINFO_INSTALL_CONFIG_PARAM_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), OSINFO_TYPE_INSTALL_CONFIG_PARAM, OsinfoInstallConfigParamPrivate))
+
+/**
+ * SECTION:osinfo_install_config_param
+ * @short_description: OS install configuration parameters (and its policies)
+ * @see_also: #OsinfoInstallScript, #OsinfoInstallSciptConfig
+ *
+ * #OsinfoInstallConfigParam is an entity for representing all parameters that
+ * can be set in an automated installation. It is used to help applications to
+ * generate an automated installation script
+ */
+
+struct _OsinfoInstallConfigParamPrivate
+{
+    gchar *name;
+    OsinfoInstallConfigParamPolicy policy;
+};
+
+enum {
+    PROP_0,
+
+    PROP_NAME,
+    PROP_POLICY,
+};
+
+static void
+osinfo_install_config_param_set_property(GObject *object,
+                                         guint property_id,
+                                         const GValue *value,
+                                         GParamSpec *pspec)
+{
+    OsinfoInstallConfigParam *config_param =
+        OSINFO_INSTALL_CONFIG_PARAM (object);
+
+    switch (property_id)
+        {
+        case PROP_NAME:
+            config_param->priv->name = g_value_dup_string(value);
+            break;
+        case PROP_POLICY:
+            {
+            const gchar *policy = g_value_get_string(value);
+            if (g_strcmp0(policy, "required") == 0)
+                config_param->priv->policy =
+                    OSINFO_INSTALL_CONFIG_PARAM_POLICY_REQUIRED;
+            else if (g_strcmp0(policy, "optional") == 0)
+                config_param->priv->policy =
+                    OSINFO_INSTALL_CONFIG_PARAM_POLICY_OPTIONAL;
+            break;
+            }
+        default:
+            /* We don't have any other property... */
+            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+            break;
+        }
+}
+
+static void
+osinfo_install_config_param_get_property(GObject *object,
+                                         guint property_id,
+                                         GValue *value,
+                                         GParamSpec *pspec)
+{
+    OsinfoInstallConfigParam *config_param =
+        OSINFO_INSTALL_CONFIG_PARAM (object);
+
+    switch (property_id)
+        {
+        case PROP_NAME:
+            g_value_set_string(value, config_param->priv->name);
+            break;
+        case PROP_POLICY:
+            g_value_set_enum(value, config_param->priv->policy);
+            break;
+        default:
+            /* We don't have any other property... */
+            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+            break;
+        }
+}
+
+
+static void
+osinfo_install_config_param_finalize(GObject *object)
+{
+    OsinfoInstallConfigParam *config_param =
+        OSINFO_INSTALL_CONFIG_PARAM(object);
+    g_free(config_param->priv->name);
+
+    /* Chain up to the parent class */
+    G_OBJECT_CLASS (osinfo_install_config_param_parent_class)->finalize (object);
+}
+
+/* Init functions */
+static void
+osinfo_install_config_param_class_init (OsinfoInstallConfigParamClass *klass)
+{
+    GObjectClass *g_klass = G_OBJECT_CLASS (klass);
+    GParamSpec *pspec;
+
+    g_klass->set_property = osinfo_install_config_param_set_property;
+    g_klass->get_property = osinfo_install_config_param_get_property;
+
+    /**
+     * OsinfoInstallConfigParam:name:
+     *
+     * The name of the configuration parameter.
+     **/
+    pspec = g_param_spec_string("name",
+                                "Name",
+                                "Parameter name",
+                                NULL,
+                                G_PARAM_WRITABLE |
+                                G_PARAM_READABLE |
+                                G_PARAM_CONSTRUCT_ONLY |
+                                G_PARAM_STATIC_NAME |
+                                G_PARAM_STATIC_NICK |
+                                G_PARAM_STATIC_BLURB);
+    g_object_class_install_property(g_klass,
+                                    PROP_NAME,
+                                    pspec);
+    /**
+     * OsinfoInstallConfigParam:policy:
+     *
+     * The policy of the configuration parameter.
+     **/
+    pspec = g_param_spec_string("policy",
+                                "Policy",
+                                "Parameter policy",
+                                NULL,
+                                G_PARAM_WRITABLE |
+                                G_PARAM_READABLE |
+                                G_PARAM_CONSTRUCT_ONLY |
+                                G_PARAM_STATIC_NAME |
+                                G_PARAM_STATIC_NICK |
+                                G_PARAM_STATIC_BLURB);
+    g_object_class_install_property(g_klass,
+                                    PROP_POLICY,
+                                    pspec);
+
+
+    g_klass->finalize = osinfo_install_config_param_finalize;
+
+    g_type_class_add_private (klass, sizeof (OsinfoInstallConfigParamPrivate));
+}
+
+static void
+osinfo_install_config_param_init (OsinfoInstallConfigParam *config_param)
+{
+    OsinfoInstallConfigParamPrivate *priv;
+    config_param->priv = priv =
+        OSINFO_INSTALL_CONFIG_PARAM_GET_PRIVATE(config_param);
+
+    config_param->priv->name = NULL;
+    config_param->priv->policy = OSINFO_INSTALL_CONFIG_PARAM_POLICY_NONE;
+}
+
+
+/**
+ * osinfo_install_config_param_new:
+ * @name: the configuration parameter name
+ * @policy: the configuration parameter policy
+ *
+ * Construct a new configuration parameter to a #OsinfoInstallScript.
+ *
+ * Returns: (transfer full): the new configuration parameter
+ */
+OsinfoInstallConfigParam *osinfo_install_config_param_new(const gchar *name,
+                                                          const gchar *policy)
+{
+    return g_object_new(OSINFO_TYPE_INSTALL_CONFIG_PARAM,
+                        "name", name,
+                        "policy", policy,
+                        NULL);
+}
+
+/**
+ * osinfo_install_config_param_get_name:
+ * @config_param: the configuration parameter
+ *
+ * Returns: (transfer none): the name of the configuration parameter
+ */
+const gchar *osinfo_install_config_param_get_name(const OsinfoInstallConfigParam *config_param)
+{
+    return config_param->priv->name;
+}
+
+/**
+ * osinfo_install_config_param_get_policy:
+ * @config_param: the configuration parameter
+ *
+ * Returns: (transfer none): the policy of the configuration parameter
+ */
+OsinfoInstallConfigParamPolicy osinfo_install_config_param_get_policy(const OsinfoInstallConfigParam *config_param)
+{
+    return config_param->priv->policy;
+}
+
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ */
diff --git a/osinfo/osinfo_install_config_param.h b/osinfo/osinfo_install_config_param.h
new file mode 100644
index 0000000..dce47bc
--- /dev/null
+++ b/osinfo/osinfo_install_config_param.h
@@ -0,0 +1,83 @@
+/*
+ * libosinfo: OS installation configuration
+ *
+ * Copyright (C) 2009-2012 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Authors:
+ *   Fabiano Fidêncio <fabiano at fidencio.org>
+ */
+
+#include <glib-object.h>
+
+#ifndef __OSINFO_INSTALL_CONFIG_PARAM_H__
+#define __OSINFO_INSTALL_CONFIG_PARAM_H__
+
+/*
+ * Type macros.
+ */
+#define OSINFO_TYPE_INSTALL_CONFIG_PARAM            (osinfo_install_config_param_get_type ())
+#define OSINFO_INSTALL_CONFIG_PARAM(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), OSINFO_TYPE_INSTALL_CONFIG_PARAM, OsinfoInstallConfigParam))
+#define OSINFO_IS_INSTALL_CONFIG_PARAM(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), OSINFO_TYPE_INSTALL_CONFIG_PARAM))
+#define OSINFO_INSTALL_CONFIG_PARAM_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), OSINFO_TYPE_INSTALL_CONFIG_PARAM, OsinfoInstallConfigParamClass))
+#define OSINFO_IS_INSTALL_CONFIG_PARAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), OSINFO_TYPE_INSTALL_CONFIG_PARAM))
+#define OSINFO_INSTALL_CONFIG_PARAM_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), OSINFO_TYPE_INSTALL_CONFIG_PARAM, OsinfoInstallConfigParamClass))
+
+typedef struct _OsinfoInstallConfigParam        OsinfoInstallConfigParam;
+typedef struct _OsinfoInstallConfigParamClass   OsinfoInstallConfigParamClass;
+typedef struct _OsinfoInstallConfigParamPrivate OsinfoInstallConfigParamPrivate;
+
+typedef enum {
+    OSINFO_INSTALL_CONFIG_PARAM_POLICY_NONE,
+    OSINFO_INSTALL_CONFIG_PARAM_POLICY_REQUIRED,
+    OSINFO_INSTALL_CONFIG_PARAM_POLICY_OPTIONAL,
+} OsinfoInstallConfigParamPolicy;
+
+/* object */
+struct _OsinfoInstallConfigParam
+{
+    OsinfoEntity parent_instance;
+    /* public */
+
+    /* private */
+    OsinfoInstallConfigParamPrivate *priv;
+};
+
+/* class */
+struct _OsinfoInstallConfigParamClass
+{
+    OsinfoEntityClass parent_class;
+
+    /* class members */
+};
+
+GType osinfo_install_config_param_get_type(void);
+
+OsinfoInstallConfigParam *osinfo_install_config_param_new(const gchar *name, const gchar *policy);
+
+const gchar *osinfo_install_config_param_get_name(const OsinfoInstallConfigParam *config_param);
+
+OsinfoInstallConfigParamPolicy osinfo_install_config_param_get_policy(const OsinfoInstallConfigParam *config_param);
+
+
+#endif /* __OSINFO_INSTALL_CONFIG_PARAM_H__ */
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ */
diff --git a/osinfo/osinfo_install_script.c b/osinfo/osinfo_install_script.c
index 2d0b440..2a1dfbb 100644
--- a/osinfo/osinfo_install_script.c
+++ b/osinfo/osinfo_install_script.c
@@ -47,6 +47,7 @@ G_DEFINE_TYPE (OsinfoInstallScript, osinfo_install_script, OSINFO_TYPE_ENTITY);
 struct _OsinfoInstallScriptPrivate
 {
     gchar *output_prefix;
+    GList *config_param_list;
 };
 
 enum {
@@ -137,12 +138,12 @@ osinfo_os_get_property(GObject    *object,
 }
 
 
-
 static void
 osinfo_install_script_finalize (GObject *object)
 {
     OsinfoInstallScript *script = OSINFO_INSTALL_SCRIPT (object);
     g_free(script->priv->output_prefix);
+    g_list_free_full(script->priv->config_param_list, g_object_unref);
 
     /* Chain up to the parent class */
     G_OBJECT_CLASS (osinfo_install_script_parent_class)->finalize (object);
@@ -216,6 +217,51 @@ osinfo_install_script_class_init (OsinfoInstallScriptClass *klass)
     g_type_class_add_private (klass, sizeof (OsinfoInstallScriptPrivate));
 }
 
+void osinfo_install_script_add_config_param(OsinfoInstallScript *script, OsinfoInstallConfigParam *param)
+{
+    g_return_if_fail(OSINFO_IS_INSTALL_SCRIPT(script));
+    g_return_if_fail(OSINFO_IS_INSTALL_CONFIG_PARAM(param));
+
+    script->priv->config_param_list =
+        g_list_prepend(script->priv->config_param_list, param);
+}
+
+gboolean osinfo_install_script_has_config_param(const OsinfoInstallScript *script, const OsinfoInstallConfigParam *config_param)
+{
+    guint i, list_size = g_list_length(script->priv->config_param_list);
+
+    for (i = 0; i < list_size; i++)
+    {
+        OsinfoInstallConfigParam *tmp;
+        tmp = g_list_nth_data(script->priv->config_param_list, i);
+
+        if (g_strcmp0(osinfo_install_config_param_get_name(tmp),
+                      osinfo_install_config_param_get_name(config_param)) == 0)
+            return TRUE;
+    }
+    return FALSE;
+}
+
+gboolean osinfo_install_script_has_config_param_name(const OsinfoInstallScript *script, const gchar *name)
+{
+    guint i, list_size = g_list_length(script->priv->config_param_list);
+
+    for (i = 0; i < list_size; i++)
+    {
+        OsinfoInstallConfigParam *tmp;
+        tmp = g_list_nth_data(script->priv->config_param_list, i);
+
+        if (g_strcmp0(osinfo_install_config_param_get_name(tmp), name) == 0)
+            return TRUE;
+    }
+    return FALSE;
+}
+
+GList *osinfo_install_script_get_config_param_list(const OsinfoInstallScript *script)
+{
+    return g_list_copy(script->priv->config_param_list);
+}
+
 static void
 osinfo_install_script_init (OsinfoInstallScript *list)
 {
@@ -223,6 +269,7 @@ osinfo_install_script_init (OsinfoInstallScript *list)
     list->priv = priv = OSINFO_INSTALL_SCRIPT_GET_PRIVATE(list);
 
     list->priv->output_prefix = NULL;
+    list->priv->config_param_list = NULL;
 }
 
 
diff --git a/osinfo/osinfo_install_script.h b/osinfo/osinfo_install_script.h
index 440fd7e..21a50b3 100644
--- a/osinfo/osinfo_install_script.h
+++ b/osinfo/osinfo_install_script.h
@@ -23,6 +23,7 @@
 
 #include <glib-object.h>
 #include <gio/gio.h>
+#include <osinfo/osinfo_install_config_param.h>
 
 #ifndef __OSINFO_INSTALL_SCRIPT_H__
 #define __OSINFO_INSTALL_SCRIPT_H__
@@ -50,7 +51,8 @@ typedef struct _OsinfoInstallScriptPrivate OsinfoInstallScriptPrivate;
 #define OSINFO_INSTALL_SCRIPT_PROP_PROFILE            "profile"
 #define OSINFO_INSTALL_SCRIPT_PROP_PRODUCT_KEY_FORMAT "product-key-format"
 #define OSINFO_INSTALL_SCRIPT_PROP_OUTPUT_FILENAME    "output-filename"
-
+#define OSINFO_INSTALL_SCRIPT_PROP_CONFIG_REQUIRED    "required"
+#define OSINFO_INSTALL_SCRIPT_PROP_CONFIG_OPTIONAL    "optional"
 
 /* object */
 struct _OsinfoInstallScript
@@ -127,6 +129,14 @@ GFile *osinfo_install_script_generate_output(OsinfoInstallScript *script,
                                              GCancellable *cancellable,
                                              GError **error);
 
+gboolean osinfo_install_script_has_config_param(const OsinfoInstallScript *script, const OsinfoInstallConfigParam *config_param);
+
+gboolean osinfo_install_script_has_config_param_name(const OsinfoInstallScript *script, const gchar *name);
+
+void osinfo_install_script_add_config_param(OsinfoInstallScript *script, OsinfoInstallConfigParam *param);
+
+GList *osinfo_install_script_get_config_param_list(const OsinfoInstallScript *script);
+
 #endif /* __OSINFO_INSTALL_SCRIPT_H__ */
 /*
  * Local variables:
diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
index 31e442e..76ac793 100644
--- a/osinfo/osinfo_loader.c
+++ b/osinfo/osinfo_loader.c
@@ -540,6 +540,35 @@ static void osinfo_loader_deployment(OsinfoLoader *loader,
     osinfo_db_add_deployment(loader->priv->db, deployment);
 }
 
+static void osinfo_loader_install_config_param(OsinfoLoader *loader,
+                                               OsinfoEntity *entity,
+                                               const gchar *xpath,
+                                               xmlXPathContextPtr ctxt,
+                                               xmlNodePtr root,
+                                               GError **err)
+{
+    xmlNodePtr *nodes = NULL;
+    int nnodes = osinfo_loader_nodeset(xpath, ctxt, &nodes, err);
+    int i;
+    if (error_is_set(err))
+        return;
+
+    for (i = 0 ; i < nnodes ; i++) {
+        gchar *name = (gchar *)xmlGetProp(nodes[i], BAD_CAST "name");
+        gchar *policy = (gchar *)xmlGetProp(nodes[i], BAD_CAST "policy");
+        OsinfoInstallConfigParam *param =
+            osinfo_install_config_param_new(name, policy);
+        osinfo_install_script_add_config_param(OSINFO_INSTALL_SCRIPT(entity),
+                                               param);
+
+        g_free(name);
+        g_free(policy);
+    };
+
+    g_free(nodes);
+}
+
+
 
 static void osinfo_loader_install_script(OsinfoLoader *loader,
                                          xmlXPathContextPtr ctxt,
@@ -594,6 +623,13 @@ static void osinfo_loader_install_script(OsinfoLoader *loader,
                                 value);
     g_free(value);
 
+    osinfo_loader_install_config_param(loader,
+                                       OSINFO_ENTITY(installScript),
+                                       "./config/*",
+                                       ctxt,
+                                       root,
+                                       err);
+
     osinfo_db_add_install_script(loader->priv->db, installScript);
 
     return;
-- 
1.7.11.2




More information about the virt-tools-list mailing list