On Mon, Aug 13, 2012 at 4:54 AM, Christophe Fergeau <cfergeau@xxxxxxxxxx> wrote: > On Mon, Aug 13, 2012 at 04:37:37AM -0300, Fabiano Fidêncio wrote: >> 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@xxxxxxxxxxxx> >> + */ >> + >> +#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@xxxxxxxxxxxx> >> + */ >> + >> +#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; > > as discussed on IRC, this loop and the one below should look like: > > for (l = the_list; l != NULL; l = l->next) { > SomeType *p = l->data; > do_something (p); > } > > otherwise you'll get a quadratic behaviour. Fixed. Thanks :) > > Christophe -- Fabiano Fidêncio