5.4. Resumen

La interfaz de usuario de eBox tiene una página "Resumen" donde se muestra la información del estado de cada módulo. Esta página tiene dos partes:

La información del resumen es recogida llamando a dos funciones abstractas definidas en EBox::Module, si no desea implementarlas, entonces no se mostrará información sobre ese módulo. statusSummary rellena la tabla en la que se mostrará el estado de los servicios de red y summary crea la sección resumen para el módulo.

La forma en que el resumen está construido es muy parecida a la forma en que lo está el menú, como se puede ver en Sección 5.3. Hay unas cuantas clases en el espacio de nombres EBox::Summary que se pueden usar para construir la información de resumen. statusSummary debería devolver un objeto de tipo EBox::Summary::Status mientras que summary es libre de devolver cualquier objeto cuyo tipo sea un subtipo de EBox::Summary::Item, aunque la mayor parte de los módulos sólo devuelvan un EBox::Summary::Module.

Cada uno de las subclases de EBox::Summary::Item tiene algunos atributos y pueden contener otros objetos EBox::Summary::Item, y que todos ellos saquen algo de código HTML. EBox::Summary::Module tiene un atributo title, que cuando llega el momento de generar la página muestra el título title y el html para sus hijos por debajo suyo.

Para ver como está construida la sección resumen, vamos a echar un vistazo al módulo network. La salida de su resumen es un título y una sección por cada interfaz de red, con un título en negrita y una tabla que muestra su dirección MAC, dirección IP, máscara de red, etc. Ejemplo 5.16 muestra las partes importantes de su función summary.

Ejemplo 5.16. Implementación de ejemplo de summary

my $item = new	EBox::Summary::Module(__("Interfaces de red"));

foreach my $iface (@{$ifaces}) {
	my $status = __("down");
	my $section = new EBox::Summary::Section($iface);
	$item->add($section);

	if (iface_is_up($iface)) {
		$status = __("up");
	}
	$section->add(new EBox::Summary::Value (__("Status"), $status));

	my $ether = iface_mac_address($iface);
	if ($ether) {
		$section->add(new EBox::Summary::Value(
			__("dirección MAC"), $ether));
	}

	my @ips = iface_addresses($iface);
	foreach my $ip (@ips) {
		$section->add(new EBox::Summary::Value(
			__("dirección IP"), "$ip"));
	}
}
return $item;

Primero se crea un objeto EBox::Summary::Module. Éste objeto mantendrá toda la información del resumen.

Entonces se creará un objeto de tipo EBox::Summary::Section para cada interfaz de red. Es una sección con un título (pasado como argumento al constructor) y contiene varios objetos EBox::Summary::Value, los cuales muestran el nombre y un valor asociado como filas de una tabla en la sección. Por tanto, varios valores se añaden a cada sección y las secciones son añadidas al objeto EBox::Summary::Module. El resultado es un árbol de objetos, y su raíz es la EBox::Summary::Module. Cuando se le pide imprimirse, muestra su título y pide a cada uno de sus hijos que se impriman. Para ver como es, sólo hace falta abrir la página Resumen de una instalación de eBox.

summary puede devolver cualquier objeto siempre que herede de EBox::Summary::Item, puede crearse uno propio si las necesidades no son cubiertas por los elementos estándar que vienen con la plataforma.

statusSummary es más sencillo. Solo ha de devolver un objeto EBox::Summary::Status. El constructor para esta clase necesita tres argumentos:

La razón por la cual existe este tercer argumento es que existen servicios que el usuario no debería poder iniciar, en la página de resumen, porque no han sido configurados. Así si, por ejemplo, el servicio de squid está desconectado, el usuario tendrá que ir a la página de configuración de squid y activar allí el servicio. Ejemplo 5.17 muestra la implementación de la función statusSummary en el módulo squid, además de algunas funciones relacionadas.

Ejemplo 5.17. Ejemplo de implementación de statusSummary

sub statusSummary
{
	my $self = shift;
	return new EBox::Summary::Status('squid', __('Proxy HTTP'),
					$self->isRunning, $self->service);
}

sub isRunning
{
	my $self = shift;
	return $self->pidFileRunning(PIDFILE);
}

sub service
{
	my $self = shift;
	return $self->get_bool('active');
}

De nuevo, se puede comprobar como se ve en la página de Resumen en una instalación de eBox que tiene el módulo squid incluido.