Capítulo 2. API Básica

Tabla de contenidos

2.1. EBox::Global
2.2. Excepciones
2.3. Validación de datos
2.4. i18n
2.4.1. i18n para desarrolladores
2.4.2. i18n para traductores

2.1. EBox::Global

La clase EBox::Global ofrece varias funciones para la administración de módulos. Las funciones utilizadas más comúnmente son las que hacen referencia a la instanciación de módulos. EBox::Global funciona como una factoría de módulos, obtienes una instancia suya usando la función estática getInstance y después usar esa instancia para crear módulos. La factoría puede tener dos formas, una de sólo lectura y otra de lectura-escritura.

Llamar a getInstance sin argumentos producirá una factoría de lectura-escritura, la cual crea módulos que le permiten hacer llamadas para cambiar la configuración. Un detalle muy importante de los módulos lectura-escritura es que devuelven la información de su última configuración, incluso si no se ha guardado todavía (lo que significa que podría ser revocada más tarde por el usuario). Esta idea es importante, ya que la configuración que nos ofrece el módulo lectura-escritura no debe ser tratada como definitiva, a no ser que el módulo no tenga cambios esperando a ser guardados. Puede ver si un módulo tiene cambios sin guardar llamando a la función modIsChanged en la clase EBox::Global.

La idea subyacente en el comportamiento de los módulos lectura-escritura es tener un front-end para construir una configuración. Por ejemplo, si el usuario crea un nuevo objeto de red en el módulo objetos, el nuevo objeto mostrará instantáneamente la configuración del firewall y se podrá crear nuevas reglas del firewall que lo usen. Después de realizar todos los cambios deseados, el usuario guarda la configuración. Si decide cancelar los cambios que acaba de hacer, tanto el nuevo objeto como las reglas del firewall serán borradas.

Hay una situación en la que no desea recoger la información que no ha sido guardada todavía. Ésta es cuando se está generando el fichero de configuración de un demonio, configurando las reglas del firewall, configurando la dirección de un interfaz de red, o cualquier otra actividad que necesita la configuración real y definitiva. Esta situación se encuentra en los scripts del sistema (el script de arranque, trabajos de cron, etc). En estos casos necesita lo que se denominan módulos de sólo-lectura, que sólo ofrecen la información almacenada y no permiten hacer llamadas a funciones que cambiarían la configuración del módulo. Para obtener módulos de sólo-lectura necesita crear una instancia de EBox::Global configurando su parámetro readonly como true. Las instancias del módulo devueltas por una factoría creada de esta forma serán de sólo-lectura. Este script muestra como obtener una instancia del módulo squid y le pide que se reinicie:

Ejemplo 2.1. Creando una instancia de un módulo de sólo-lectura

#!/usr/bin/perl

use strict;
use warnings;

use EBox;
use EBox::Global;
use Error qw(:try);

EBox::init();

my $global = EBox::Global->getInstance(1);
my $squid = $global->modInstance('squid');

try {
	$squid->restartService();
} catch EBox::Exceptions::Base with {
	print STDERR "El módulo Squid falló al reiniciarse.\n";
};

Hay dos funciones que hacen más sencillo realizar dos tareas muy comunes: obtener una instancia de cada módulo y obtener una instancia de cada módulo que implemente alguna clase abstracta. Éstas son modInstances y modInstancesOfType. Usarlas es muy sencillo:

Ejemplo 2.2. Funciones para instanciar más de un módulo

my $global = EBox::Global->getInstance(1);

# se reinician todos los módulos
foreach my $mod (@{$global->modInstances()}) {
	$mod->restartService();
}

# se reinician todos los módulos que implementen la clase NetworkObserver
foreach my $mod (@{$global->modInstancesOfType('EBox::NetworkObserver')}) {
	$mod->restartService();
}

Reiniciar todos los módulos es todavía más sencillo que eso. EBox::Global nos provee de la función restartAllModules justamente para eso. Éste es uno de los métodos que realiza una operación en todos los módulos instalados:

restartAllModules

Llama a la función restartService de todos los módulos. Reinicia todos los servicios manejados por eBox. Los ficheros de configuración son regenerados cada vez que un servicio es reiniciado.

stopAllModules

Llama a la función stopService en todos los módulos, esto incluye la interfaz web de administración, por lo que hay que ser cauteloso.

revokeAllModules

Cancela los cambios de configuración que se han hecho en todos los módulos desde la última vez que la configuración se guardó.

saveAllModules

Guarda los cambios de la configuración en todos los módulos.