eBox utiliza GConf para almacenar su configuración. La plataforma de desarrollo ofrece un recubrimiento sobre los bindings originales de perl. GConf ofrece una sencilla API para almacenar y consultar configuración con valores clasificados por tipos y organizada jerárquicamente. También nos permite definir esquemas limitados para algunas claves de configuración, configurando sus tipos y valores por defecto.
La plataforma de desarrollo define un recubrimiento sobre el API
de GConf más algunas funcionalidades añadidas. El recubrimiento es
implementado como una clase hija de
Ebox::Module, así que todos los módulos que
quieren usar GConf heredan de
EBox::GConfModule. Sus hijos automáticamente
adquieren estas características:
Copias de seguridad automáticos: La primera vez
que la clave de un valor es modificada, se hace una
copia de seguridad del árbol completo de configuración
para ese módulo. Cuando la configuración se guarda, la
copia de seguridad es automáticamente
eliminada. Cuando los cambios en la configuración son
descartados, la copia de seguridad es automáticamente
recuperada. EBox::GConfModule
implementa las funciones
makeBackup,
restoreBackup y
revokeConfig definidas en la
clase EBox::Module, por lo que
las clases hijas de
EBox::GConfModule no necesitan
implementar estas funciones a no ser que se necesite
algún requisito en especial o almacenar parte de su
configuración fuera de GConf.
Manejo de errores: Los errores de GConf son manejados por la clase recubridora. Ella los traduce a excepciones internas.
Instancias de sólo-lectura y sólo-escritura: Cuando el módulo es instanciado en modo sólo-lectura, la clase recubridora utiliza una copia de la configuración para evitar ver que hay cambios sin guardar. También previene de llamadas a métodos que escriban en GConf.
Comprobación de los límites del espacio de nombre: El recubrimiento comprueba todas las claves de GConf utilizadas por el módulo, para ver si están en su espacio de nombres. Esto asegura que las claves para un módulo sólo son leídas o escritas directamente por el propio módulo (siempre que todos los módulos utilicen esta clase recubridora).
Rutas relativas: las funciones en la clase recubridora pueden recibir para las claves de gconf tanto rutas absolutas como relativas. La raíz del espacio de nombres de un módulo cambia dependiendo del tipo de instancia (sólo-lectura o lectura-escritura) y el tipo de clave (normal o de estado) a la cual se acceda. Por esta razón lo mejor es utilizar rutas relativas cuando se llamen a las funciones de la clase recubridora, ya que ellas traducen la ruta relativa en una ruta absoluta automáticamente.
Estado del espacio de nombres: hay cierta
información que no es suministrada por el usuario y
que necesita ser escrita en cualquier momento, incluso
en las instancias de sólo-lectura. Este tipo de
información no está sujeta a guardar o cancelar la
configuración. Es la información de estado, como los
nombres de los servidores o la dirección IP dada por
el sistema por un servidor DHCP externo. Un espacio de
nombres aparte está disponible para este tipo de
información, y de nuevo es automáticamente apartado de
las operaciones de copia de seguridad, guardado y
cancelación mencionadas anteriormente. Las funciones
que suelen acceder a este espacio de nombres son
idénticas a las normales, sólo que tienen el prefijo
st_ en sus nombres.
Recuperación recursiva de directorios: hay dos
funciones en EBox::GConfModule
que permiten fácilmente recuperar la estructura
completa de
directorios. hash_from_dir
toma un directorio como argumento y devuelve un hash
con todas las claves que están por debajo
suyo. array_from_dir toma un
directorio como argumento y devuelve un array de
hashes tal y como devuelve
hash_from_dir para cada uno
de sus subdirectorios.
Esta es la lista de las funciones más importantes en
EBox::GConfModule:
all_dirsDada una clave, devuelve todos los directorios de su interior.
all_dirs_baseDada una clave, devuelve todos los directorios de su interior, eliminando cualquier directorio que aparezca por delante.
all_entriesDada una clave, devuelve todas las entradas de su interior. Estas entradas son todas aquellas claves que no son directorios, por lo que contendrán un valor.
all_entries_baseDada una clave, devuelve todas las de su interior, eliminando cualquier directorio que aparezca por delante. Las entradas son todas aquellas claves que no son directorios, por lo que contendrán un valor.
array_from_dirDada una clave, devuelve un array
utilizando una referencia a un hash para
contener en cada elemento los directorios bajo
su clave. También, el hash contiene la clave
_dir que dice cual
es el nombre del directorio.
dir_existsDada una clave que referencia un
directorio, devuelve true
si existe.
get_boolDevuelve el valor de una clave de tipo booleano.
get_intDevuelve el valor de una clave de tipo entero.
get_listDevuelve un array conteniendo la lista referenciada por la clave.
get_stringDevuelve el valor de una clave de tipo cadena.
get_unique_idGeneral un identificado único aleatorio
con un prefix delante
en la raíz del nombre del espacio del
módulo. Si directory es
pasado, será añadido a la ruta. Notar que esto
no crea la entrada, únicamente devuelve un
identificador único, así que es tarea del
programador crear la entrada correctamente.
hash_from_dirDevuelve un hash conteniendo todas las entradas del directorio referenciado por la clave.
isReadOnlyDevuelve true si la
instancia actual de
EBox::GConfModule a la
que se está accediendo es de sólo-lectura.
makeBackupVuelca el contenido actual de la configuración a un fichero.
restoreBackupRecupera el último backup.
revokeConfigTodos los cambios hechos desde que se escribió o eliminó algo serán descartados.
set_boolAsigna un valor
booleano a una clave.
set_intAsigna un valor
entero a una
clave.
set_listAsigna una lista de
valores de un
tipo en un
valor.
set_stringAsigna un valor
de tipo cadena en la clave.
Veamos algunos ejemplos de las funciones anteriormente descritas.
Ejemplo 3.3. Asignando un valor de tipo cadena
$self->set_string("printers/x4235/name", "fooprinter"); Ejemplo 3.4. Asignando una lista de cadenas
$self->set_list('foo/foolist', 'string', ['foo', 'bar']);Ejemplo 3.5. Recogiendo y usando un identificador único
my $id = $self->get_unique_id('p', 'printers');
$self->set_string("printers/$id/name", $name);
$self->set_bool("printers/$id/configured", undef);