Tabla de contenidos
Hay tres razones diferentes por las cuales tu módulo puede necesitar interactuar con otros módulos:
El caso más simple es sólo la necesidad de cambiar alguna configuración de otro módulo utilizando su API. Un ejemplo de esto son todos los módulos que ofrecen servicios de red. Todos ellos necesitan decirle al firewall en que puerto van a estar escuchando, para que pueda mostrar todos los servicios en la configuración del interfaz, dejando al usuario que elija quien hace uso de cada uno. Este caso es trivial, sólo cree una instancia del módulo que quiera llamar y use su API para lo que necesite.
El segundo caso son las dependencias. Una dependencia se observa cuando un módulo mantiene una referencia a partes de la configuración manejada por otros módulos y necesita reiniciarse cuando los otros módulos cambian la configuración. Un ejemplo de este caso es el firewall, te deja definir reglas por cada objeto de red definido en el modulo objects. Sin embargo si crea reglas para un objeto, y entonces usa el interfaz de usuario de objects para añadir nuevos miembros a ese objeto, el firewall necesitaría reiniciarse también, para que esas reglas creadas se apliquen también al nuevo objeto. Esta situación es muy sencilla de manejar, el firewall declara una dependencia en el módulo network en su esquema de GConf y entonces la plataforma automáticamente reinicia el módulo firewall cuando el módulo objects es reiniciado. La declaración de dependencias está explicada en Sección 3.6
Finalmente, la situación más compleja es cuando alguna información de la configuración del módulo en desarrollo depende de la configuración de otros. En el ejemplo del firewall, ¿que pasaría si se borrase el objeto para el cual se han definido ciertas reglas? Este tipo de situación requiere cooperación entre ambos módulos para que puedan ofrecer un comportamiento consistente al usuario. Esto es sobre lo que trata todo este capítulo. Las siguientes secciones describirán como los módulos objects, firewall y network resuelvan este problema (estos módulos son los, normalmente, más necesitados por otros), y mostrará como resolver este problema en nuestros propios desarrollos de módulos.
Suponga que está escribiendo un módulo DHCP y desea configurar el servicio DHCP con una base distinta por cada interfaz de red. Sin embargo, no a todos los interfaces se les debe permitir tener un demonio DHCP corriendo en ellos. Si el usuario configura el interfaz eth1 como cliente DHCP, entonces no tiene sentido dejarle configurar un servidor DHCP en dicho interfaz. Así que, se decide que las páginas de configuración de DHCP sólo mostrarán los interfaces de red que tengan configurada una IP estática. Eso está bien, pero ¿que pasaría si el usuario configura el servicio DHCP en un interfaz estático y más tarde intenta cambiar el interfaz a DHCP o sin nada?
Aquellos módulos que pudieran informar a otros módulos
sobre ciertos eventos definen clases abstractas
observer, las cuales otros módulos pueden
extender si ellos necesitan ser notificados cuando ocurran
tales eventos. El módulo network provee de la clase
EBox::NetworkObserver para este
propósito. Esta clase tiene varias funciones abstractas, por
lo que el módulo podría implementar cualquiera de estas
funciones y ser notificado cuando un evento relevante sucediera.