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();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>
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.