3.6. Esquemas de GConf

3.6.1. Esquema de GConf mínimo

Un esquema de GConf es una clave especial de GConf que configura el tipo y el valor por defecto de alguna clave de GConf. Son almacenados en la base de datos de GConf bajo el directorio /schemas.

Necesitará crear un esquema de GConf para el módulo. Esto es necesario, al menos para integrar el módulo con la plataforma. Por medio de este esquema, el módulo podrá ser instanciado. Por tanto, la primera cosas que se deberá hacer es asociar el nombre dado para el módulo y su módulo de perl. Veamos el ejemplo para clarificar un poco más esta idea:

Digamos que tenemos un módulo llamado foobar y la implementación para este módulo recae en EBox::Foobar. El esquema de GConf sería algo así:

Ejemplo 3.10. Esquema de GConf mínimo

<gconfschemafile>
<schemalist>
	<schema>
		<key>/schemas/ebox/modules/global/modules/foobar/class</key>
		<applyto>/ebox/modules/global/modules/foobar/class</applyto>
		<owner>ebox</owner>
		<type>string</type>
		<default>EBox::Foobar</default>
		<locale name="C"/>
	</schema>
</schemalist>
</gconfschemafile>

Una vez que ha hecho esto, cada vez que se instancie el módulo foobar utilizando el método modInstance de EBox::Global, sabrá que tiene que cargar e instanciar la clase EBox::Foobar.

Ejemplo 3.11. Creando la instancia de un módulo

my $foobar = EBox::Global->modInstance('foobar');
$foobar->some_method();

3.6.2. Valores por defecto

Los esquemas de GConf son útiles para estableces valores por defecto. Estos valores se usarán por el sistema cuando el usuario no ha dado un valor a la clave correspondiente.

Hay un escenario obvio en el cual puede estar interesado en utilizar estas características. Este es cuando su módulo es instalado por primera vez. Podría ser útil configurar unos valores por defecto en la configuración inicial.

Vamos a ilustrar esto con un pequeño ejemplo. Imagine que está desarrollando un módulo para manejar un proxy HTTP. Uno de los parámetros configurables es el puerto por donde escucha. Desea que el usuario tenga la capacidad de cambiarlo, pero también desea que tenga como valor inicial configurado, el puerto 3128. El esquema de GConf es el sitio ideal para hacerlo. Para este ejemplo, usaremos la clave /schemas/ebox/modules/proxy/port.

Ejemplo 3.12. Configurando un valor por defecto en los esquemas de GConf

<schema>
	<key>/schemas/ebox/modules/proxy/port</key>
	<applyto>/ebox/modules/proxy/port</applyto>
	<owner>ebox</owner>
	<type>int</type>
	<default>3128</default>
	<locale name="C"/>
</schema>

3.6.3. Dependencias de módulos

Es cuestión de la configuración de su módulo que pueda depender de otros. Si esto ocurre, estará interesado en que le sea notificado cada vez que hay un cambio en cualquiera de los módulos de los que depende.

Continuando con el ejemplo utilizado anteriormente, considere que desea configurar el proxy para que escuche únicamente en los interfaces internos. El módulo network se el único que maneja los interfaces de red. Así que en el momento de generar la configuración del proxy, se le pedirá al módulo network los interfaces de red configurados como internos. Esto levanta una duda obvia, el módulo debería regenerar su configuración cuando el interfaz interno cambia, esto es, cuando la configuración del módulo network cambie.

Para expresar esta relación de dependencia haremos uso del esquema de gconf del módulo de esta forma:

Ejemplo 3.13. Configurando dependencias entre módulos

<schema>
	<key>/schemas/ebox/modules/global/modules/proxy/depends</key>
	<applyto>/ebox/modules/global/modules/proxy/depends</applyto>
	<owner>ebox</owner>
	<type>list</type>
	<list_type>string</list_type>
	<default>[network]</default>
	<locale name="C"/>
</schema>

El trozo de código le dice al módulo global que proxy depende de network. De esta forma, el módulo global lanzará la función _regenConfig de EBox::Proxy cuando la configuración del módulo de red cambie.