[virt-tools-list] [PATCH libosinfo 2/7] Add APIs for dealing with installer automation scripts

Daniel P. Berrange berrange at redhat.com
Tue Feb 28 15:26:18 UTC 2012


From: "Daniel P. Berrange" <berrange at redhat.com>

This introduces two new objects

 - OsinfoInstallConfig - stores configuration parameters which get
   substituted into the install script template.
 - OsinfoInstallScript - provides a template and the mechanism for
   turning it into an install script using XSLT
---
 configure.ac                       |    1 +
 docs/reference/Libosinfo.types     |    3 +
 libosinfo.spec.in                  |    1 +
 mingw32-libosinfo.spec.in          |    1 +
 osinfo/Makefile.am                 |   11 +
 osinfo/libosinfo.syms              |   35 ++
 osinfo/osinfo.h                    |    3 +
 osinfo/osinfo_install_config.c     |  325 +++++++++++++++++
 osinfo/osinfo_install_config.h     |  157 ++++++++
 osinfo/osinfo_install_script.c     |  696 ++++++++++++++++++++++++++++++++++++
 osinfo/osinfo_install_script.h     |  113 ++++++
 osinfo/osinfo_install_scriptlist.c |  169 +++++++++
 osinfo/osinfo_install_scriptlist.h |   82 +++++
 13 files changed, 1597 insertions(+), 0 deletions(-)
 create mode 100644 osinfo/osinfo_install_config.c
 create mode 100644 osinfo/osinfo_install_config.h
 create mode 100644 osinfo/osinfo_install_script.c
 create mode 100644 osinfo/osinfo_install_script.h
 create mode 100644 osinfo/osinfo_install_scriptlist.c
 create mode 100644 osinfo/osinfo_install_scriptlist.h

diff --git a/configure.ac b/configure.ac
index 462d5e1..2e3d4d2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -32,6 +32,7 @@ PKG_CHECK_MODULES([GIO], [gio-2.0])
 PKG_CHECK_MODULES([SOUP], [libsoup-2.4])
 PKG_CHECK_MODULES([SOUP_GNOME], [libsoup-gnome-2.4])
 PKG_CHECK_MODULES([LIBXML], [libxml-2.0 >= 2.6.0])
+PKG_CHECK_MODULES([LIBXSLT], [libxslt >= 1.0.0])
 
 GTK_DOC_CHECK([1.10],[--flavour no-tmpl])
 
diff --git a/docs/reference/Libosinfo.types b/docs/reference/Libosinfo.types
index 2cf0934..faf8643 100644
--- a/docs/reference/Libosinfo.types
+++ b/docs/reference/Libosinfo.types
@@ -8,6 +8,9 @@ osinfo_devicelinklist_get_type
 osinfo_devicelist_get_type
 osinfo_entity_get_type
 osinfo_filter_get_type
+osinfo_install_config_get_type
+osinfo_install_script_get_type
+osinfo_install_scriptlist_get_type
 osinfo_list_get_type
 osinfo_loader_get_type
 osinfo_media_get_type
diff --git a/libosinfo.spec.in b/libosinfo.spec.in
index 28f4804..d241a54 100644
--- a/libosinfo.spec.in
+++ b/libosinfo.spec.in
@@ -22,6 +22,7 @@ URL: https://fedorahosted.org/libosinfo/
 BuildRequires: glib2-devel
 BuildRequires: check-devel
 BuildRequires: libxml2-devel >= 2.6.0
+BuildRequires: libxslt-devel >= 1.0.0
 BuildRequires: vala
 BuildRequires: vala-tools
 BuildRequires: libsoup-devel
diff --git a/mingw32-libosinfo.spec.in b/mingw32-libosinfo.spec.in
index 0ec510c..cc1e727 100644
--- a/mingw32-libosinfo.spec.in
+++ b/mingw32-libosinfo.spec.in
@@ -22,6 +22,7 @@ BuildRequires: mingw32-binutils
 
 BuildRequires: mingw32-glib2
 BuildRequires: mingw32-libxml2
+BuildRequires: mingw32-libxslt
 BuildRequires: mingw32-libsoup
 BuildRequires: mingw32-libsoup-gnome
 BuildRequires: pkgconfig
diff --git a/osinfo/Makefile.am b/osinfo/Makefile.am
index 98e2365..36fe9e4 100644
--- a/osinfo/Makefile.am
+++ b/osinfo/Makefile.am
@@ -26,6 +26,7 @@ libosinfo_1_0_la_CFLAGS = \
 	$(COVERAGE_CFLAGS) \
 	-I$(top_srcdir) \
 	$(LIBXML_CFLAGS) \
+	$(LIBXSLT_CFLAGS) \
 	$(GOBJECT_CFLAGS) \
 	$(GIO_CFLAGS) \
 	-DDATA_DIR='"$(pkgdatadir)/data"'
@@ -33,12 +34,15 @@ libosinfo_1_0_la_CFLAGS = \
 libosinfo_1_0_la_LDFLAGS = \
 	$(COVERAGE_LDFLAGS) \
 	$(LIBXML_LIBS) \
+	$(LIBXSLT_LIBS) \
 	$(GOBJECT_LIBS) \
 	$(GIO_LIBS) \
 	$(VERSION_SCRIPT_FLAGS)$(LIBOSINFO_VERSION_FILE) \
         -version-info $(LIBOSINFO_VERSION_INFO) \
 	$(NO_UNDEFINED_FLAGS)
 
+libosinfo_1_0_la_DEPENDENCIES = libosinfo.syms
+
 libosinfo_1_0_includedir = $(includedir)/libosinfo-1.0/osinfo
 
 libosinfo_1_0_include_HEADERS = \
@@ -52,6 +56,9 @@ libosinfo_1_0_include_HEADERS = \
   osinfo_devicelinkfilter.h	\
   osinfo_entity.h		\
   osinfo_filter.h		\
+  osinfo_install_config.h       \
+  osinfo_install_script.h       \
+  osinfo_install_scriptlist.h   \
   osinfo_product.h		\
   osinfo_productfilter.h	\
   osinfo_productlist.h		\
@@ -79,6 +86,9 @@ libosinfo_1_0_la_SOURCES =	\
   osinfo_devicelist.c		\
   osinfo_devicelinklist.c	\
   osinfo_devicelinkfilter.c	\
+  osinfo_install_config.c       \
+  osinfo_install_script.c       \
+  osinfo_install_scriptlist.c   \
   osinfo_product.c		\
   osinfo_productfilter.c	\
   osinfo_productlist.c		\
@@ -119,6 +129,7 @@ Libosinfo-1.0.gir: libosinfo-1.0.la $(G_IR_SCANNER) Makefile.am
 		--pkg=gobject-2.0 \
 		--pkg=gio-2.0 \
 		--pkg=libxml-2.0 \
+		--pkg=libxslt \
 		$(libosinfo_1_0_include_HEADERS:%=$(srcdir)/%) \
 		$(libosinfo_1_0_la_SOURCES:%=$(srcdir)/%)
 
diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
index bb6da44..a9bb5c2 100644
--- a/osinfo/libosinfo.syms
+++ b/osinfo/libosinfo.syms
@@ -211,6 +211,41 @@ LIBOSINFO_0.1.0 {
     global:
 	osinfo_entity_set_param_boolean;
 	osinfo_entity_get_param_value_boolean;
+	osinfo_install_config_get_type;
+	osinfo_install_config_new;
+	osinfo_install_config_get_l10n_keyboard;
+	osinfo_install_config_get_l10n_language;
+	osinfo_install_config_get_l10n_timezone;
+	osinfo_install_config_get_admin_password;
+	osinfo_install_config_get_user_login;
+	osinfo_install_config_get_user_password;
+	osinfo_install_config_get_user_realname;
+	osinfo_install_config_get_user_administrator;
+	osinfo_install_config_get_user_autologin;
+	osinfo_install_config_set_l10n_keyboard;
+	osinfo_install_config_set_l10n_language;
+	osinfo_install_config_set_l10n_timezone;
+	osinfo_install_config_set_admin_password;
+	osinfo_install_config_set_user_login;
+	osinfo_install_config_set_user_password;
+	osinfo_install_config_set_user_realname;
+	osinfo_install_config_set_user_administrator;
+	osinfo_install_config_set_user_autologin;
+	osinfo_install_script_get_type;
+	osinfo_install_script_new;
+	osinfo_install_script_new_data;
+	osinfo_install_script_new_uri;
+	osinfo_install_script_generate;
+	osinfo_install_script_generate_async;
+	osinfo_install_script_generate_finish;
+	osinfo_install_script_get_profile;
+	osinfo_install_script_get_uri;
+	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_tree_new;
 	osinfo_tree_create_from_location;
 	osinfo_tree_create_from_location_async;
diff --git a/osinfo/osinfo.h b/osinfo/osinfo.h
index bb2a057..aa06095 100644
--- a/osinfo/osinfo.h
+++ b/osinfo/osinfo.h
@@ -33,6 +33,9 @@
 #include <osinfo/osinfo_devicelist.h>
 #include <osinfo/osinfo_devicelinklist.h>
 #include <osinfo/osinfo_devicelinkfilter.h>
+#include <osinfo/osinfo_install_config.h>
+#include <osinfo/osinfo_install_script.h>
+#include <osinfo/osinfo_install_scriptlist.h>
 #include <osinfo/osinfo_productlist.h>
 #include <osinfo/osinfo_product.h>
 #include <osinfo/osinfo_productfilter.h>
diff --git a/osinfo/osinfo_install_config.c b/osinfo/osinfo_install_config.c
new file mode 100644
index 0000000..80643b1
--- /dev/null
+++ b/osinfo/osinfo_install_config.c
@@ -0,0 +1,325 @@
+/*
+ * 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:
+ *   Daniel P. Berrange <berrange at redhat.com>
+ */
+
+#include <config.h>
+
+#include <osinfo/osinfo.h>
+
+G_DEFINE_TYPE (OsinfoInstallConfig, osinfo_install_config, OSINFO_TYPE_ENTITY);
+
+#define OSINFO_INSTALL_CONFIG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), OSINFO_TYPE_INSTALL_CONFIG, OsinfoInstallConfigPrivate))
+
+/**
+ * SECTION:osinfo_install_config
+ * @short_description: OS install configuration
+ * @see_also: #OsinfoInstallScript
+ *
+ * #OsinfoInstallConfig is an object for representing OS
+ * install configuration data. It is used to generate an
+ * automated installation script
+ */
+
+struct _OsinfoInstallConfigPrivate
+{
+    gboolean unused;
+};
+
+
+/* Init functions */
+static void
+osinfo_install_config_class_init (OsinfoInstallConfigClass *klass)
+{
+    g_type_class_add_private (klass, sizeof (OsinfoInstallConfigPrivate));
+}
+
+static const gchar valid[] = {
+    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'X', 'W', 'X', 'Y', 'Z',
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_', '+',
+    '=', '!', '@', '#', '%', '^', '&', ',', '(', ')', '[', '{', '}',
+    '[', ']', ';', ':', '<', '>', ',', '.', '?', '/', '~',
+};
+
+
+static void
+osinfo_install_config_init (OsinfoInstallConfig *config)
+{
+    OsinfoInstallConfigPrivate *priv;
+    gchar pass[9];
+    gsize i;
+
+    config->priv = priv = OSINFO_INSTALL_CONFIG_GET_PRIVATE(config);
+
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD,
+                            "us");
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE,
+                            "America/New_York");
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE,
+                            "en_US.UTF-8");
+
+    for (i = 0 ; i < sizeof(pass)-1 ; i++) {
+        gint val = g_random_int_range(0, sizeof(valid));
+        pass[i] = valid[val];
+    }
+    pass[sizeof(pass)-1] = '\0';
+
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_ADMIN_PASSWORD,
+                            pass);
+}
+
+
+/**
+ * osinfo_install_config_new:
+ *
+ * Construct a new install configuration that is initially empty.
+ *
+ * Returns: (transfer full): an empty install configuration
+ */
+OsinfoInstallConfig *osinfo_install_config_new(const gchar *id)
+{
+    return g_object_new(OSINFO_TYPE_INSTALL_CONFIG,
+                        "id", id,
+                        NULL);
+}
+
+void osinfo_install_config_set_hardware_arch(OsinfoInstallConfig *config,
+                                             const gchar *arch)
+{
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_HARDWARE_ARCH,
+                            arch);
+}
+
+
+const gchar *osinfo_install_config_get_hardware_arch(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
+                                         OSINFO_INSTALL_CONFIG_PROP_HARDWARE_ARCH);
+}
+
+
+void osinfo_install_config_set_l10n_keyboard(OsinfoInstallConfig *config,
+                                             const gchar *keyboard)
+{
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD,
+                            keyboard);
+}
+
+
+const gchar *osinfo_install_config_get_l10n_keyboard(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
+                                         OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD);
+}
+
+
+void osinfo_install_config_set_l10n_language(OsinfoInstallConfig *config,
+                                             const gchar *language)
+{
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE,
+                            language);
+}
+
+
+const gchar *osinfo_install_config_get_l10n_language(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
+                                         OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE);
+}
+
+
+void osinfo_install_config_set_l10n_timezone(OsinfoInstallConfig *config,
+                                             const gchar *tz)
+{
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE,
+                            tz);
+}
+
+
+const gchar *osinfo_install_config_get_l10n_timezone(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
+                                         OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE);
+}
+
+
+void osinfo_install_config_set_admin_password(OsinfoInstallConfig *config,
+                                              const gchar *password)
+{
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_ADMIN_PASSWORD,
+                            password);
+}
+
+
+const gchar *osinfo_install_config_get_admin_password(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
+                                         OSINFO_INSTALL_CONFIG_PROP_ADMIN_PASSWORD);
+}
+
+
+void osinfo_install_config_set_user_login(OsinfoInstallConfig *config,
+                                          const gchar *username)
+{
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_USER_LOGIN,
+                            username);
+}
+
+
+const gchar *osinfo_install_config_get_user_login(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
+                                         OSINFO_INSTALL_CONFIG_PROP_USER_LOGIN);
+}
+
+
+
+void osinfo_install_config_set_user_password(OsinfoInstallConfig *config,
+                                             const gchar *password)
+{
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_USER_PASSWORD,
+                            password);
+}
+
+
+const gchar *osinfo_install_config_get_user_password(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
+                                         OSINFO_INSTALL_CONFIG_PROP_USER_PASSWORD);
+}
+
+
+void osinfo_install_config_set_user_realname(OsinfoInstallConfig *config,
+                                             const gchar *name)
+{
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_USER_REALNAME,
+                            name);
+}
+
+
+const gchar *osinfo_install_config_get_user_realname(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
+                                         OSINFO_INSTALL_CONFIG_PROP_USER_REALNAME);
+}
+
+
+
+void osinfo_install_config_set_user_autologin(OsinfoInstallConfig *config,
+                                              gboolean autologin)
+{
+    osinfo_entity_set_param_boolean(OSINFO_ENTITY(config),
+                                    OSINFO_INSTALL_CONFIG_PROP_USER_AUTOLOGIN,
+                                    autologin);
+}
+
+
+gboolean osinfo_install_config_get_user_autologin(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value_boolean(OSINFO_ENTITY(config),
+                                                 OSINFO_INSTALL_CONFIG_PROP_USER_AUTOLOGIN);
+}
+
+
+void osinfo_install_config_set_user_administrator(OsinfoInstallConfig *config,
+                                                  gboolean admin)
+{
+    osinfo_entity_set_param_boolean(OSINFO_ENTITY(config),
+                                    OSINFO_INSTALL_CONFIG_PROP_USER_ADMIN,
+                                    admin);
+}
+
+
+gboolean osinfo_install_config_get_user_administrator(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value_boolean(OSINFO_ENTITY(config),
+                                                 OSINFO_INSTALL_CONFIG_PROP_USER_ADMIN);
+}
+
+
+void osinfo_install_config_set_reg_login(OsinfoInstallConfig *config,
+                                         const gchar *name)
+{
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_REG_LOGIN,
+                            name);
+}
+
+const gchar *osinfo_install_config_get_reg_login(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
+                                         OSINFO_INSTALL_CONFIG_PROP_REG_LOGIN);
+}
+
+
+void osinfo_install_config_set_reg_password(OsinfoInstallConfig *config,
+                                            const gchar *password)
+{
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_REG_PASSWORD,
+                            password);
+}
+
+const gchar *osinfo_install_config_get_reg_password(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
+                                         OSINFO_INSTALL_CONFIG_PROP_REG_PASSWORD);
+}
+
+
+void osinfo_install_config_set_reg_product_key(OsinfoInstallConfig *config,
+                                               const gchar *key)
+{
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_REG_PRODUCTKEY,
+                            key);
+}
+
+const gchar *osinfo_install_config_get_reg_product_key(OsinfoInstallConfig *config)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
+                                         OSINFO_INSTALL_CONFIG_PROP_REG_PRODUCTKEY);
+}
+
+
+
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ */
diff --git a/osinfo/osinfo_install_config.h b/osinfo/osinfo_install_config.h
new file mode 100644
index 0000000..2d1c065
--- /dev/null
+++ b/osinfo/osinfo_install_config.h
@@ -0,0 +1,157 @@
+/*
+ * 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:
+ *   Daniel P. Berrange <berrange at redhat.com>
+ */
+
+#include <glib-object.h>
+
+#ifndef __OSINFO_INSTALL_CONFIG_H__
+#define __OSINFO_INSTALL_CONFIG_H__
+
+/*
+ * Type macros.
+ */
+#define OSINFO_TYPE_INSTALL_CONFIG                  (osinfo_install_config_get_type ())
+#define OSINFO_INSTALL_CONFIG(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), OSINFO_TYPE_INSTALL_CONFIG, OsinfoInstallConfig))
+#define OSINFO_IS_INSTALL_CONFIG(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), OSINFO_TYPE_INSTALL_CONFIG))
+#define OSINFO_INSTALL_CONFIG_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), OSINFO_TYPE_INSTALL_CONFIG, OsinfoInstallConfigClass))
+#define OSINFO_IS_INSTALL_CONFIG_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), OSINFO_TYPE_INSTALL_CONFIG))
+#define OSINFO_INSTALL_CONFIG_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), OSINFO_TYPE_INSTALL_CONFIG, OsinfoInstallConfigClass))
+
+#define OSINFO_INSTALL_CONFIG_PROP_HARDWARE_ARCH  "hardware-arch"
+
+#define OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE  "l10n-timezone"
+#define OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE  "l10n-language"
+#define OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD  "l10n-keyboard"
+
+#define OSINFO_INSTALL_CONFIG_PROP_ADMIN_PASSWORD "admin-password"
+
+#define OSINFO_INSTALL_CONFIG_PROP_USER_PASSWORD  "user-password"
+#define OSINFO_INSTALL_CONFIG_PROP_USER_LOGIN     "user-login"
+#define OSINFO_INSTALL_CONFIG_PROP_USER_REALNAME  "user-realname"
+#define OSINFO_INSTALL_CONFIG_PROP_USER_AUTOLOGIN "user-autologin"
+#define OSINFO_INSTALL_CONFIG_PROP_USER_ADMIN     "user-admin"
+
+#define OSINFO_INSTALL_CONFIG_PROP_REG_LOGIN      "reg-login"
+#define OSINFO_INSTALL_CONFIG_PROP_REG_PASSWORD   "reg-password"
+#define OSINFO_INSTALL_CONFIG_PROP_REG_PRODUCTKEY "reg-product-key"
+
+
+typedef struct _OsinfoInstallConfig        OsinfoInstallConfig;
+typedef struct _OsinfoInstallConfigClass   OsinfoInstallConfigClass;
+typedef struct _OsinfoInstallConfigPrivate OsinfoInstallConfigPrivate;
+
+/* object */
+struct _OsinfoInstallConfig
+{
+    OsinfoEntity parent_instance;
+
+    /* public */
+
+    /* private */
+    OsinfoInstallConfigPrivate *priv;
+};
+
+/* class */
+struct _OsinfoInstallConfigClass
+{
+    OsinfoEntityClass parent_class;
+
+    /* class members */
+};
+
+GType osinfo_install_config_get_type(void);
+
+OsinfoInstallConfig *osinfo_install_config_new(const gchar *id);
+
+void osinfo_install_config_set_hardware_arch(OsinfoInstallConfig *config,
+                                             const gchar *arch);
+const gchar *osinfo_install_config_get_hardware_arch(OsinfoInstallConfig *config);
+
+void osinfo_install_config_set_l10n_keyboard(OsinfoInstallConfig *config,
+                                             const gchar *keyboard);
+const gchar *osinfo_install_config_get_l10n_keyboard(OsinfoInstallConfig *config);
+
+void osinfo_install_config_set_l10n_language(OsinfoInstallConfig *config,
+                                             const gchar *language);
+const gchar *osinfo_install_config_get_l10n_language(OsinfoInstallConfig *config);
+
+void osinfo_install_config_set_l10n_timezone(OsinfoInstallConfig *config,
+                                             const gchar *timezone);
+const gchar *osinfo_install_config_get_l10n_timezone(OsinfoInstallConfig *config);
+
+
+
+
+void osinfo_install_config_set_admin_password(OsinfoInstallConfig *config,
+                                              const gchar *password);
+const gchar *osinfo_install_config_get_admin_password(OsinfoInstallConfig *config);
+
+
+
+
+void osinfo_install_config_set_user_login(OsinfoInstallConfig *config,
+                                          const gchar *username);
+const gchar *osinfo_install_config_get_user_login(OsinfoInstallConfig *config);
+
+
+void osinfo_install_config_set_user_password(OsinfoInstallConfig *config,
+                                             const gchar *password);
+const gchar *osinfo_install_config_get_user_password(OsinfoInstallConfig *config);
+
+
+void osinfo_install_config_set_user_realname(OsinfoInstallConfig *config,
+                                             const gchar *name);
+const gchar *osinfo_install_config_get_user_realname(OsinfoInstallConfig *config);
+
+
+void osinfo_install_config_set_user_autologin(OsinfoInstallConfig *config,
+                                              gboolean autologin);
+gboolean osinfo_install_config_get_user_autologin(OsinfoInstallConfig *config);
+
+
+void osinfo_install_config_set_user_administrator(OsinfoInstallConfig *config,
+                                                  gboolean admin);
+gboolean osinfo_install_config_get_user_administrator(OsinfoInstallConfig *config);
+
+
+
+void osinfo_install_config_set_reg_login(OsinfoInstallConfig *config,
+                                         const gchar *name);
+const gchar *osinfo_install_config_get_reg_login(OsinfoInstallConfig *config);
+
+void osinfo_install_config_set_reg_password(OsinfoInstallConfig *config,
+                                            const gchar *password);
+const gchar *osinfo_install_config_get_reg_password(OsinfoInstallConfig *config);
+
+void osinfo_install_config_set_reg_product_key(OsinfoInstallConfig *config,
+                                               const gchar *key);
+const gchar *osinfo_install_config_get_reg_product_key(OsinfoInstallConfig *config);
+
+
+#endif /* __OSINFO_INSTALL_CONFIG_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
new file mode 100644
index 0000000..7bf1e2e
--- /dev/null
+++ b/osinfo/osinfo_install_script.c
@@ -0,0 +1,696 @@
+/*
+ * 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:
+ *   Daniel P. Berrange <berrange at redhat.com>
+ */
+
+#include <config.h>
+
+#include <osinfo/osinfo.h>
+#include <string.h>
+#include <libxml/tree.h>
+#include <libxslt/transform.h>
+#include <libxslt/xsltutils.h>
+#include <libxslt/xsltInternals.h>
+
+G_DEFINE_TYPE (OsinfoInstallScript, osinfo_install_script, OSINFO_TYPE_ENTITY);
+
+#define OSINFO_INSTALL_SCRIPT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), OSINFO_TYPE_INSTALL_SCRIPT, OsinfoInstallScriptPrivate))
+
+/**
+ * SECTION:osinfo_install_script
+ * @short_description: OS install scripturation
+ * @see_also: #OsinfoInstallScript
+ *
+ * #OsinfoInstallScript is an object for representing OS
+ * install scripturation data. It is used to generate an
+ * automated installation script
+ */
+
+struct _OsinfoInstallScriptPrivate
+{
+    gboolean unused;
+};
+
+enum {
+    PROP_0,
+
+    PROP_TEMPLATE_URI,
+    PROP_TEMPLATE_DATA,
+    PROP_PROFILE,
+    PROP_PRODUCT_KEY_FORMAT,
+};
+
+
+static void
+osinfo_os_set_property(GObject    *object,
+                       guint       property_id,
+                       const GValue     *value,
+                       GParamSpec *pspec)
+{
+    OsinfoInstallScript *script = OSINFO_INSTALL_SCRIPT(object);
+    const gchar *data;
+
+    switch (property_id) {
+    case PROP_TEMPLATE_URI:
+        data = g_value_get_string(value);
+        if (data)
+            osinfo_entity_set_param(OSINFO_ENTITY(script),
+                                    OSINFO_INSTALL_SCRIPT_PROP_TEMPLATE_URI,
+                                    data);
+        break;
+
+    case PROP_TEMPLATE_DATA:
+        data = g_value_get_string(value);
+        if (data)
+            osinfo_entity_set_param(OSINFO_ENTITY(script),
+                                    OSINFO_INSTALL_SCRIPT_PROP_TEMPLATE_DATA,
+                                    data);
+        break;
+
+    case PROP_PROFILE:
+        data = g_value_get_string(value);
+        if (data)
+            osinfo_entity_set_param(OSINFO_ENTITY(script),
+                                    OSINFO_INSTALL_SCRIPT_PROP_PROFILE,
+                                    data);
+        break;
+
+    default:
+        /* We don't have any other property... */
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+        break;
+    }
+}
+
+static void
+osinfo_os_get_property(GObject    *object,
+                       guint       property_id,
+                       GValue     *value,
+                       GParamSpec *pspec)
+{
+    OsinfoInstallScript *script = OSINFO_INSTALL_SCRIPT(object);
+
+    switch (property_id) {
+    case PROP_TEMPLATE_URI:
+        g_value_set_string(value,
+                           osinfo_install_script_get_template_uri(script));
+        break;
+
+    case PROP_TEMPLATE_DATA:
+        g_value_set_string(value,
+                           osinfo_install_script_get_template_data(script));
+        break;
+
+    case PROP_PROFILE:
+        g_value_set_string(value,
+                           osinfo_install_script_get_profile(script));
+        break;
+
+    case PROP_PRODUCT_KEY_FORMAT:
+        g_value_set_string(value,
+                           osinfo_install_script_get_product_key_format(script));
+        break;
+
+    default:
+        /* We don't have any other property... */
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+        break;
+    }
+}
+
+
+
+static void
+osinfo_install_script_finalize (GObject *object)
+{
+    /* Chain up to the parent class */
+    G_OBJECT_CLASS (osinfo_install_script_parent_class)->finalize (object);
+}
+
+/* Init functions */
+static void
+osinfo_install_script_class_init (OsinfoInstallScriptClass *klass)
+{
+    GObjectClass *g_klass = G_OBJECT_CLASS (klass);
+    GParamSpec *pspec;
+
+    g_klass->get_property = osinfo_os_get_property;
+    g_klass->set_property = osinfo_os_set_property;
+    g_klass->finalize = osinfo_install_script_finalize;
+
+    pspec = g_param_spec_string("template-uri",
+                                "TemplateURI",
+                                "URI for install script template",
+                                NULL /* default value */,
+                                G_PARAM_READABLE |
+                                G_PARAM_WRITABLE |
+                                G_PARAM_CONSTRUCT_ONLY |
+                                G_PARAM_STATIC_NAME |
+                                G_PARAM_STATIC_NICK |
+                                G_PARAM_STATIC_BLURB);
+    g_object_class_install_property(g_klass,
+                                    PROP_TEMPLATE_URI,
+                                    pspec);
+
+    pspec = g_param_spec_string("template-data",
+                                "TemplateData",
+                                "Data for install script template",
+                                NULL /* default value */,
+                                G_PARAM_READABLE |
+                                G_PARAM_WRITABLE |
+                                G_PARAM_CONSTRUCT_ONLY |
+                                G_PARAM_STATIC_NAME |
+                                G_PARAM_STATIC_NICK |
+                                G_PARAM_STATIC_BLURB);
+    g_object_class_install_property(g_klass,
+                                    PROP_TEMPLATE_DATA,
+                                    pspec);
+
+    pspec = g_param_spec_string("profile",
+                                "Profile",
+                                "Install script profile name",
+                                NULL /* default value */,
+                                G_PARAM_READABLE |
+                                G_PARAM_WRITABLE |
+                                G_PARAM_CONSTRUCT_ONLY |
+                                G_PARAM_STATIC_NAME |
+                                G_PARAM_STATIC_NICK |
+                                G_PARAM_STATIC_BLURB);
+    g_object_class_install_property(g_klass,
+                                    PROP_PROFILE,
+                                    pspec);
+
+    pspec = g_param_spec_string("product-key-format",
+                                "Product Key Format",
+                                "Product key format mask",
+                                NULL /* default value */,
+                                G_PARAM_READABLE |
+                                G_PARAM_STATIC_NAME |
+                                G_PARAM_STATIC_NICK |
+                                G_PARAM_STATIC_BLURB);
+    g_object_class_install_property(g_klass,
+                                    PROP_PROFILE,
+                                    pspec);
+
+    g_type_class_add_private (klass, sizeof (OsinfoInstallScriptPrivate));
+}
+
+static void
+osinfo_install_script_init (OsinfoInstallScript *list)
+{
+    OsinfoInstallScriptPrivate *priv;
+    list->priv = priv = OSINFO_INSTALL_SCRIPT_GET_PRIVATE(list);
+
+}
+
+
+OsinfoInstallScript *osinfo_install_script_new(const gchar *id)
+{
+    return g_object_new(OSINFO_TYPE_INSTALL_SCRIPT,
+                        "id", id,
+                        NULL);
+}
+
+/**
+ * osinfo_install_script_new_data:
+ *
+ * Construct a new install script from stylesheet data
+ *
+ * Returns: (transfer full): an new install script
+ */
+OsinfoInstallScript *osinfo_install_script_new_data(const gchar *id,
+                                                    const gchar *profile,
+                                                    const gchar *templateData)
+{
+    return g_object_new(OSINFO_TYPE_INSTALL_SCRIPT,
+                        "id", id,
+                        "profile", profile,
+                        "template-data", templateData,
+                        NULL);
+}
+
+
+/**
+ * osinfo_install_script_new_uri:
+ *
+ * Construct a new install script from a stylesheet URI
+ *
+ * Returns: (transfer full): an new install script
+ */
+OsinfoInstallScript *osinfo_install_script_new_uri(const gchar *id,
+                                                   const gchar *profile,
+                                                   const gchar *templateUri)
+{
+    return g_object_new(OSINFO_TYPE_INSTALL_SCRIPT,
+                        "id", id,
+                        "profile", profile,
+                        "template-uri", templateUri,
+                        NULL);
+}
+
+
+const gchar *osinfo_install_script_get_template_uri(OsinfoInstallScript *script)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(script),
+                                         OSINFO_INSTALL_SCRIPT_PROP_TEMPLATE_URI);
+}
+
+const gchar *osinfo_install_script_get_template_data(OsinfoInstallScript *script)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(script),
+                                         OSINFO_INSTALL_SCRIPT_PROP_TEMPLATE_DATA);
+}
+
+const gchar *osinfo_install_script_get_profile(OsinfoInstallScript *script)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(script),
+                                         OSINFO_INSTALL_SCRIPT_PROP_PROFILE);
+}
+
+const gchar *osinfo_install_script_get_product_key_format(OsinfoInstallScript *script)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(script),
+                                         OSINFO_INSTALL_SCRIPT_PROP_PRODUCT_KEY_FORMAT);
+}
+
+struct OsinfoInstallScriptGenerate {
+    GSimpleAsyncResult *res;
+    OsinfoOs *os;
+    OsinfoInstallConfig *config;
+    OsinfoInstallScript *script;
+};
+
+
+static void osinfo_install_script_generate_free(struct OsinfoInstallScriptGenerate *data)
+{
+    g_object_unref(data->os);
+    g_object_unref(data->config);
+    g_object_unref(data->script);
+    g_object_unref(data->res);
+    g_free(data);
+}
+
+
+static xsltStylesheetPtr osinfo_install_script_load_template(const gchar *uri,
+                                                             const gchar *template,
+                                                             GError **error)
+{
+    xsltStylesheetPtr xslt = NULL;
+    xmlDocPtr doc = NULL;
+    xmlParserCtxtPtr pctxt;
+
+    /* Set up a parser context so we can catch the details of XML errors. */
+    pctxt = xmlNewParserCtxt();
+    if (!pctxt || !pctxt->sax) {
+        g_set_error(error, 0, 0, "%s",
+                    "Unable to create XML parser context");
+        goto cleanup;
+    }
+
+    if (!(doc = xmlCtxtReadDoc(pctxt, BAD_CAST template, uri, NULL,
+                               XML_PARSE_NOENT | XML_PARSE_NONET |
+                               XML_PARSE_NOWARNING))) {
+        g_set_error(error, 0, 0, "%s",
+                    "Unable to read XSL template");
+        goto cleanup;
+    }
+
+    if (!(xslt = xsltParseStylesheetDoc(doc))) {
+        g_set_error(error, 0, 0, "%s",
+                    "Unable to parse XSL template");
+        goto cleanup;
+    }
+
+ cleanup:
+    xmlFreeParserCtxt(pctxt);
+    return xslt;
+}
+
+static xmlNodePtr osinfo_install_script_generate_entity_config(OsinfoInstallConfig *config,
+                                                               OsinfoEntity *entity,
+                                                               const gchar *name,
+                                                               GError **error)
+{
+    xmlNodePtr node = NULL;
+    xmlNodePtr data = NULL;
+    GList *keys;
+    GList *tmp1;
+
+    if (!(node = xmlNewDocNode(NULL, NULL, (xmlChar*)name, NULL))) {
+        xmlErrorPtr err = xmlGetLastError();
+        g_set_error(error, 0, 0, "Unable to create XML node '%s': '%s'",
+                    name, err ? err->message : "");
+        goto error;
+    }
+
+    if (!(data = xmlNewDocNode(NULL, NULL, (const xmlChar*)"id",
+                               (const xmlChar*)osinfo_entity_get_id(entity)))) {
+        xmlErrorPtr err = xmlGetLastError();
+        g_set_error(error, 0, 0, "Unable to create XML node 'id': '%s'",
+                    err ? err->message : "");
+        goto error;
+    }
+    if (!(xmlAddChild(node, data))) {
+        xmlErrorPtr err = xmlGetLastError();
+        g_set_error(error, 0, 0, "Unable to add XML child '%s'", err ? err->message : "");
+        goto error;
+    }
+    data = NULL;
+
+    tmp1 = keys = osinfo_entity_get_param_keys(entity);
+    while (tmp1) {
+        GList *values = osinfo_entity_get_param_value_list(entity, tmp1->data);
+        GList *tmp2 = values;
+
+        while (tmp2) {
+            if (!(data = xmlNewDocNode(NULL, NULL, (const xmlChar*)tmp1->data,
+                                       (const xmlChar*)tmp2->data))) {
+                xmlErrorPtr err = xmlGetLastError();
+                g_set_error(error, 0, 0, "Unable to create XML node '%s': '%s'",
+                            (const gchar *)tmp1->data, err ? err->message : "");
+                goto error;
+            }
+            if (!(xmlAddChild(node, data))) {
+                xmlErrorPtr err = xmlGetLastError();
+                g_set_error(error, 0, 0, "Unable to add XML child '%s'", err ? err->message : "");
+                goto error;
+            }
+            data = NULL;
+
+            tmp2 = tmp2->next;
+        }
+        g_list_free(values);
+
+        tmp1 = tmp1->next;
+    }
+    g_list_free(keys);
+
+    return node;
+
+ error:
+    xmlFreeNode(data);
+    xmlFreeNode(node);
+    return NULL;
+}
+
+
+static xmlDocPtr osinfo_install_script_generate_config_xml(OsinfoInstallScript *script,
+                                                           OsinfoOs *os,
+                                                           OsinfoInstallConfig *config,
+                                                           GError **error)
+{
+    xmlDocPtr doc = xmlNewDoc((xmlChar *)"1.0");
+    xmlNodePtr root;
+    xmlNodePtr node;
+
+    root = xmlNewDocNode(NULL,
+                         NULL,
+                         (xmlChar*)"install-script-config",
+                         NULL);
+    xmlDocSetRootElement(doc, root);
+
+    if (!(node = osinfo_install_script_generate_entity_config(config,
+                                                              OSINFO_ENTITY(script),
+                                                              "script",
+                                                              error)))
+        goto error;
+    if (!(xmlAddChild(root, node))) {
+        xmlErrorPtr err = xmlGetLastError();
+        g_set_error(error, 0, 0, "Unable to set XML root '%s'", err ? err->message : "");
+        goto error;
+    }
+
+    if (!(node = osinfo_install_script_generate_entity_config(config,
+                                                              OSINFO_ENTITY(os),
+                                                              "os",
+                                                              error)))
+        goto error;
+    if (!(xmlAddChild(root, node))) {
+        xmlErrorPtr err = xmlGetLastError();
+        g_set_error(error, 0, 0, "Unable to set XML root '%s'", err ? err->message : "");
+        goto error;
+    }
+
+    if (!(node = osinfo_install_script_generate_entity_config(config,
+                                                              OSINFO_ENTITY(config),
+                                                              "config",
+                                                              error)))
+        goto error;
+    if (!(xmlAddChild(root, node))) {
+        xmlErrorPtr err = xmlGetLastError();
+        g_set_error(error, 0, 0, "Unable to set XML root '%s'", err ? err->message : "");
+        goto error;
+    }
+
+    return doc;
+
+ error:
+    xmlFreeDoc(doc);
+    doc = NULL;
+    return NULL;
+}
+
+static gchar *osinfo_install_script_apply_xslt(xsltStylesheetPtr ss,
+                                               xmlDocPtr doc,
+                                               GError **error)
+{
+    xsltTransformContextPtr ctxt;
+    gchar *ret;
+    xmlDocPtr docOut = NULL;
+    int len;
+
+    if (!(ctxt = xsltNewTransformContext(ss, doc))) {
+        g_set_error(error, 0, 0, "%s", "Unable to create XSL transform context");
+        goto cleanup;
+    }
+
+    if (!(docOut = xsltApplyStylesheetUser(ss, doc, NULL, NULL, NULL, ctxt))) {
+        g_set_error(error, 0, 0, "%s", "Unable to apply XSL transform context");
+        goto cleanup;
+    }
+
+    if (xsltSaveResultToString((xmlChar **)&ret, &len, docOut, ss) < 0) {
+        g_set_error(error, 0, 0, "%s", "Unable to convert XSL output to string");
+        goto cleanup;
+    }
+
+ cleanup:
+    xmlFreeDoc(docOut);
+    xsltFreeTransformContext(ctxt);
+    return ret;
+}
+
+
+static gboolean osinfo_install_script_apply_template(OsinfoInstallScript *script,
+                                                     OsinfoOs *os,
+                                                     const gchar *templateUri,
+                                                     const gchar *template,
+                                                     gchar **result,
+                                                     OsinfoInstallConfig *config,
+                                                     GError **error)
+{
+    gboolean ret = FALSE;
+    xsltStylesheetPtr templateXsl = osinfo_install_script_load_template(templateUri, template, error);
+    xmlDocPtr configXml = osinfo_install_script_generate_config_xml(script, os, config, error);
+
+    if (!templateXsl || !configXml)
+        goto cleanup;
+
+    if (!(*result = osinfo_install_script_apply_xslt(templateXsl, configXml, error)))
+        goto cleanup;
+
+    ret = TRUE;
+
+ cleanup:
+    xsltFreeStylesheet(templateXsl);
+    xmlFreeDoc(configXml);
+    return ret;
+}
+
+
+static void osinfo_install_script_template_loaded(GObject *src,
+                                                  GAsyncResult *res,
+                                                  gpointer user_data)
+{
+    struct OsinfoInstallScriptGenerate *data = user_data;
+    GError *error = NULL;
+    gchar *input = NULL;
+    gchar *output = NULL;
+    gsize length = 0;
+    GFile *file = G_FILE(src);
+    gchar *uri = g_file_get_uri(file);
+
+    if (!g_file_load_contents_finish(file,
+                                     res,
+                                     &input,
+                                     &length,
+                                     NULL,
+                                     &error)) {
+        g_prefix_error(&error, "Failed to load script template %s: ", uri);
+        g_simple_async_result_take_error(data->res, error);
+        goto cleanup;
+    }
+
+
+    if (!osinfo_install_script_apply_template(data->script,
+                                              data->os,
+                                              uri,
+                                              input,
+                                              &output,
+                                              data->config,
+                                              &error)) {
+        g_prefix_error(&error, "Failed to apply script template %s: ", uri);
+        g_simple_async_result_take_error(data->res, error);
+        goto cleanup;
+    }
+
+    g_simple_async_result_set_op_res_gpointer(data->res,
+                                              output, NULL);
+
+ cleanup:
+    g_simple_async_result_complete(data->res);
+    osinfo_install_script_generate_free(data);
+    g_free(uri);
+}
+
+
+void osinfo_install_script_generate_async(OsinfoInstallScript *script,
+                                          OsinfoOs *os,
+                                          OsinfoInstallConfig *config,
+                                          GCancellable *cancellable,
+                                          GAsyncReadyCallback callback,
+                                          gpointer user_data)
+{
+    struct OsinfoInstallScriptGenerate *data = g_new0(struct OsinfoInstallScriptGenerate, 1);
+    const gchar *templateData = osinfo_install_script_get_template_data(script);
+    const gchar *templateUri = osinfo_install_script_get_template_uri(script);
+
+    data->os = g_object_ref(os);
+    data->config = g_object_ref(config);
+    data->script = g_object_ref(script);
+    data->res = g_simple_async_result_new(G_OBJECT(script),
+                                          callback,
+                                          user_data,
+                                          osinfo_install_script_generate_async);
+
+    if (templateData) {
+        GError *error = NULL;
+        gchar *output;
+        if (!osinfo_install_script_apply_template(script,
+                                                  os,
+                                                  "<data>",
+                                                  templateData,
+                                                  &output,
+                                                  data->config,
+                                                  &error)) {
+            g_prefix_error(&error, "%s", "Failed to apply script template: ");
+            g_simple_async_result_take_error(data->res, error);
+            g_simple_async_result_complete(data->res);
+            osinfo_install_script_generate_free(data);
+            return;
+        }
+        g_simple_async_result_set_op_res_gpointer(data->res,
+                                                  output, NULL);
+        g_simple_async_result_complete_in_idle(data->res);
+        osinfo_install_script_generate_free(data);
+    } else {
+        GFile *file = g_file_new_for_uri(templateUri);
+
+        g_file_load_contents_async(file,
+                                   cancellable,
+                                   osinfo_install_script_template_loaded,
+                                   data);
+    }
+}
+
+gchar *osinfo_install_script_generate_finish(OsinfoInstallScript *script,
+                                             GAsyncResult *res,
+                                             GError **error)
+{
+    GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(res);
+
+    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
+
+    if (g_simple_async_result_propagate_error(simple, error))
+        return FALSE;
+
+    return g_simple_async_result_get_op_res_gpointer(simple);
+}
+
+
+struct OsinfoInstallScriptGenerateSync {
+    GMainLoop *loop;
+    GError *error;
+    gchar *output;
+};
+
+static void osinfo_install_script_generate_done(GObject *src,
+                                                GAsyncResult *res,
+                                                gpointer user_data)
+{
+    struct OsinfoInstallScriptGenerateSync *data = user_data;
+
+    data->output =
+        osinfo_install_script_generate_finish(OSINFO_INSTALL_SCRIPT(src),
+                                              res,
+                                              &data->error);
+    g_main_loop_quit(data->loop);
+}
+
+
+gchar *osinfo_install_script_generate(OsinfoInstallScript *script,
+                                      OsinfoOs *os,
+                                      OsinfoInstallConfig *config,
+                                      GCancellable *cancellable,
+                                      GError **error)
+{
+    GMainLoop *loop = g_main_loop_new(g_main_context_get_thread_default(),
+                                      TRUE);
+    struct OsinfoInstallScriptGenerateSync data = {
+        loop, NULL, NULL
+    };
+
+    osinfo_install_script_generate_async(script,
+                                         os,
+                                         config,
+                                         cancellable,
+                                         osinfo_install_script_generate_done,
+                                         &data);
+
+    if (g_main_loop_is_running(loop))
+        g_main_loop_run(loop);
+
+    if (data.error)
+        g_propagate_error(error, data.error);
+
+    g_main_loop_unref(loop);
+
+    return data.output;
+}
+
+
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ */
diff --git a/osinfo/osinfo_install_script.h b/osinfo/osinfo_install_script.h
new file mode 100644
index 0000000..00740c2
--- /dev/null
+++ b/osinfo/osinfo_install_script.h
@@ -0,0 +1,113 @@
+/*
+ * libosinfo: OS installation script
+ *
+ * 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:
+ *   Daniel P. Berrange <berrange at redhat.com>
+ */
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#ifndef __OSINFO_INSTALL_SCRIPT_H__
+#define __OSINFO_INSTALL_SCRIPT_H__
+
+/*
+ * Type macros.
+ */
+#define OSINFO_TYPE_INSTALL_SCRIPT                  (osinfo_install_script_get_type ())
+#define OSINFO_INSTALL_SCRIPT(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), OSINFO_TYPE_INSTALL_SCRIPT, OsinfoInstallScript))
+#define OSINFO_IS_INSTALL_SCRIPT(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), OSINFO_TYPE_INSTALL_SCRIPT))
+#define OSINFO_INSTALL_SCRIPT_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), OSINFO_TYPE_INSTALL_SCRIPT, OsinfoInstallScriptClass))
+#define OSINFO_IS_INSTALL_SCRIPT_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), OSINFO_TYPE_INSTALL_SCRIPT))
+#define OSINFO_INSTALL_SCRIPT_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), OSINFO_TYPE_INSTALL_SCRIPT, OsinfoInstallScriptClass))
+
+typedef struct _OsinfoOs        OsinfoOs;
+typedef struct _OsinfoInstallScript        OsinfoInstallScript;
+typedef struct _OsinfoInstallScriptClass   OsinfoInstallScriptClass;
+typedef struct _OsinfoInstallScriptPrivate OsinfoInstallScriptPrivate;
+
+#define OSINFO_INSTALL_SCRIPT_PROFILE_JEOS    "jeos"
+#define OSINFO_INSTALL_SCRIPT_PROFILE_DESKTOP "desktop"
+
+#define OSINFO_INSTALL_SCRIPT_PROP_TEMPLATE_URI       "template-uri"
+#define OSINFO_INSTALL_SCRIPT_PROP_TEMPLATE_DATA      "template-data"
+#define OSINFO_INSTALL_SCRIPT_PROP_PROFILE            "profile"
+#define OSINFO_INSTALL_SCRIPT_PROP_PRODUCT_KEY_FORMAT "product-key-format"
+
+/* object */
+struct _OsinfoInstallScript
+{
+    OsinfoEntity parent_instance;
+
+    /* public */
+
+    /* private */
+    OsinfoInstallScriptPrivate *priv;
+};
+
+/* class */
+struct _OsinfoInstallScriptClass
+{
+    OsinfoEntityClass parent_class;
+
+    /* class members */
+};
+
+GType osinfo_install_script_get_type(void);
+
+OsinfoInstallScript *osinfo_install_script_new(const gchar *id);
+OsinfoInstallScript *osinfo_install_script_new_uri(const gchar *id,
+                                                   const gchar *profile,
+                                                   const gchar *templateUri);
+OsinfoInstallScript *osinfo_install_script_new_data(const gchar *id,
+                                                    const gchar *profile,
+                                                    const gchar *templateData);
+
+const gchar *osinfo_install_script_get_template_uri(OsinfoInstallScript *script);
+const gchar *osinfo_install_script_get_template_data(OsinfoInstallScript *script);
+const gchar *osinfo_install_script_get_profile(OsinfoInstallScript *script);
+
+const gchar *osinfo_install_script_get_product_key_format(OsinfoInstallScript *script);
+
+void osinfo_install_script_generate_async(OsinfoInstallScript *script,
+                                          OsinfoOs *os,
+                                          OsinfoInstallConfig *config,
+                                          GCancellable *cancellable,
+                                          GAsyncReadyCallback callback,
+                                          gpointer user_data);
+
+gchar *osinfo_install_script_generate_finish(OsinfoInstallScript *script,
+                                             GAsyncResult *res,
+                                             GError **error);
+
+gchar *osinfo_install_script_generate(OsinfoInstallScript *script,
+                                      OsinfoOs *os,
+                                      OsinfoInstallConfig *config,
+                                      GCancellable *cancellable,
+                                      GError **error);
+
+
+#endif /* __OSINFO_INSTALL_SCRIPT_H__ */
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ */
diff --git a/osinfo/osinfo_install_scriptlist.c b/osinfo/osinfo_install_scriptlist.c
new file mode 100644
index 0000000..e5309b5
--- /dev/null
+++ b/osinfo/osinfo_install_scriptlist.c
@@ -0,0 +1,169 @@
+/*
+ * 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:
+ *   Arjun Roy <arroy at redhat.com>
+ *   Daniel P. Berrange <berrange at redhat.com>
+ */
+
+#include <config.h>
+
+#include <osinfo/osinfo.h>
+
+G_DEFINE_TYPE (OsinfoInstallScriptList, osinfo_install_scriptlist, OSINFO_TYPE_LIST);
+
+#define OSINFO_INSTALL_SCRIPTLIST_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), OSINFO_TYPE_INSTALL_SCRIPTLIST, OsinfoInstallScriptListPrivate))
+
+/**
+ * SECTION:osinfo_install_scriptlist
+ * @short_description: A list of installation install_script
+ * @see_also: #OsinfoList, #OsinfoInstallScript
+ *
+ * #OsinfoInstallScriptList is a list specialization that stores
+ * only #OsinfoInstallScript objects.
+ */
+
+struct _OsinfoInstallScriptListPrivate
+{
+    gboolean unused;
+};
+
+static void
+osinfo_install_scriptlist_finalize (GObject *object)
+{
+    /* Chain up to the parent class */
+    G_OBJECT_CLASS (osinfo_install_scriptlist_parent_class)->finalize (object);
+}
+
+/* Init functions */
+static void
+osinfo_install_scriptlist_class_init (OsinfoInstallScriptListClass *klass)
+{
+    GObjectClass *g_klass = G_OBJECT_CLASS (klass);
+
+    g_klass->finalize = osinfo_install_scriptlist_finalize;
+    g_type_class_add_private (klass, sizeof (OsinfoInstallScriptListPrivate));
+}
+
+static void
+osinfo_install_scriptlist_init (OsinfoInstallScriptList *list)
+{
+    OsinfoInstallScriptListPrivate *priv;
+    list->priv = priv = OSINFO_INSTALL_SCRIPTLIST_GET_PRIVATE(list);
+
+}
+
+/**
+ * osinfo_install_scriptlist_new:
+ *
+ * Construct a new install_script list that is initially empty.
+ *
+ * Returns: (transfer full): an empty install_script list
+ */
+OsinfoInstallScriptList *osinfo_install_scriptlist_new(void)
+{
+    return g_object_new(OSINFO_TYPE_INSTALL_SCRIPTLIST,
+                        "element-type", OSINFO_TYPE_INSTALL_SCRIPT,
+                        NULL);
+}
+
+/**
+ * osinfo_install_scriptlist_new_copy:
+ * @source: the install_script list to copy
+ *
+ * Construct a new install_script list that is filled with install_scripts
+ * from @source
+ *
+ * Returns: (transfer full): a copy of the install_script list
+ */
+OsinfoInstallScriptList *osinfo_install_scriptlist_new_copy(OsinfoInstallScriptList *source)
+{
+    OsinfoInstallScriptList *newList = osinfo_install_scriptlist_new();
+    osinfo_list_add_all(OSINFO_LIST(newList),
+                        OSINFO_LIST(source));
+    return newList;
+}
+
+/**
+ * osinfo_install_scriptlist_new_filtered:
+ * @source: the install_script list to copy
+ * @filter: the filter to apply
+ *
+ * Construct a new install_script list that is filled with install_scripts
+ * from @source that match @filter
+ *
+ * Returns: (transfer full): a filtered copy of the install_script list
+ */
+OsinfoInstallScriptList *osinfo_install_scriptlist_new_filtered(OsinfoInstallScriptList *source,
+                                                                OsinfoFilter *filter)
+{
+    OsinfoInstallScriptList *newList = osinfo_install_scriptlist_new();
+    osinfo_list_add_filtered(OSINFO_LIST(newList),
+                             OSINFO_LIST(source),
+                             filter);
+    return newList;
+}
+
+/**
+ * osinfo_install_scriptlist_new_intersection:
+ * @sourceOne: the first install_script list to copy
+ * @sourceTwo: the second install_script list to copy
+ *
+ * Construct a new install_script list that is filled with only the
+ * install_scripts that are present in both @sourceOne and @sourceTwo.
+ *
+ * Returns: (transfer full): an intersection of the two install_script lists
+ */
+OsinfoInstallScriptList *osinfo_install_scriptlist_new_intersection(OsinfoInstallScriptList *sourceOne,
+                                                                    OsinfoInstallScriptList *sourceTwo)
+{
+    OsinfoInstallScriptList *newList = osinfo_install_scriptlist_new();
+    osinfo_list_add_intersection(OSINFO_LIST(newList),
+                                 OSINFO_LIST(sourceOne),
+                                 OSINFO_LIST(sourceTwo));
+    return newList;
+}
+
+/**
+ * osinfo_install_scriptlist_new_union:
+ * @sourceOne: the first install_script list to copy
+ * @sourceTwo: the second install_script list to copy
+ *
+ * Construct a new install_script list that is filled with all the
+ * install_scripts that are present in either @sourceOne and @sourceTwo.
+ *
+ * Returns: (transfer full): a union of the two install_script lists
+ */
+OsinfoInstallScriptList *osinfo_install_scriptlist_new_union(OsinfoInstallScriptList *sourceOne,
+                                                             OsinfoInstallScriptList *sourceTwo)
+{
+    OsinfoInstallScriptList *newList = osinfo_install_scriptlist_new();
+    osinfo_list_add_union(OSINFO_LIST(newList),
+                          OSINFO_LIST(sourceOne),
+                          OSINFO_LIST(sourceTwo));
+    return newList;
+}
+
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ */
diff --git a/osinfo/osinfo_install_scriptlist.h b/osinfo/osinfo_install_scriptlist.h
new file mode 100644
index 0000000..39544d2
--- /dev/null
+++ b/osinfo/osinfo_install_scriptlist.h
@@ -0,0 +1,82 @@
+/*
+ * libosinfo: a list of installation install_script
+ *
+ * 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:
+ *   Zeeshan Ali <zeenix at redhat.com>
+ *   Arjun Roy <arroy at redhat.com>
+ *   Daniel P. Berrange <berrange at redhat.com>
+ */
+
+#include <glib-object.h>
+#include <osinfo/osinfo_list.h>
+
+#ifndef __OSINFO_INSTALL_SCRIPTLIST_H__
+#define __OSINFO_INSTALL_SCRIPTLIST_H__
+
+/*
+ * Type macros.
+ */
+#define OSINFO_TYPE_INSTALL_SCRIPTLIST                  (osinfo_install_scriptlist_get_type ())
+#define OSINFO_INSTALL_SCRIPTLIST(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), OSINFO_TYPE_INSTALL_SCRIPTLIST, OsinfoInstallScriptList))
+#define OSINFO_IS_INSTALL_SCRIPTLIST(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), OSINFO_TYPE_INSTALL_SCRIPTLIST))
+#define OSINFO_INSTALL_SCRIPTLIST_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), OSINFO_TYPE_INSTALL_SCRIPTLIST, OsinfoInstallScriptListClass))
+#define OSINFO_IS_INSTALL_SCRIPTLIST_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), OSINFO_TYPE_INSTALL_SCRIPTLIST))
+#define OSINFO_INSTALL_SCRIPTLIST_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), OSINFO_TYPE_INSTALL_SCRIPTLIST, OsinfoInstallScriptListClass))
+
+typedef struct _OsinfoInstallScriptList        OsinfoInstallScriptList;
+
+typedef struct _OsinfoInstallScriptListClass   OsinfoInstallScriptListClass;
+
+typedef struct _OsinfoInstallScriptListPrivate OsinfoInstallScriptListPrivate;
+
+/* object */
+struct _OsinfoInstallScriptList
+{
+    OsinfoList parent_instance;
+
+    /* public */
+
+    /* private */
+    OsinfoInstallScriptListPrivate *priv;
+};
+
+/* class */
+struct _OsinfoInstallScriptListClass
+{
+    OsinfoListClass parent_class;
+
+    /* class members */
+};
+
+GType osinfo_install_scriptlist_get_type(void);
+
+OsinfoInstallScriptList *osinfo_install_scriptlist_new(void);
+OsinfoInstallScriptList *osinfo_install_scriptlist_new_copy(OsinfoInstallScriptList *source);
+OsinfoInstallScriptList *osinfo_install_scriptlist_new_filtered(OsinfoInstallScriptList *source, OsinfoFilter *filter);
+OsinfoInstallScriptList *osinfo_install_scriptlist_new_intersection(OsinfoInstallScriptList *sourceOne, OsinfoInstallScriptList *sourceTwo);
+OsinfoInstallScriptList *osinfo_install_scriptlist_new_union(OsinfoInstallScriptList *sourceOne, OsinfoInstallScriptList *sourceTwo);
+
+#endif /* __OSINFO_INSTALL_SCRIPTLIST_H__ */
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ */
-- 
1.7.7.6




More information about the virt-tools-list mailing list