En esta receta se explica como configurar Glacier2 para permitir el acceso a IceGrid (ubicado en una red privada) desde una red pública.
En primer lugar es necesario permitir el acceso de Glacier2 a las sesiones de administración de IceGrid. Para ello hay que definir un endpoint a través de la propiedad:
IceGrid.Registry.AdminSessionManager.Endpoints=tcp -h host -p port
Por medio de la definición de estos endpoints IceGrid crea dos objetos bien conocidos que utilizará Glacier2 para la comunicación con IceGrid.
No es necesario configurar nada mas en el registry.
Ahora desde el ordenador que está conectado a ambas redes (pública y privada) se debe instanciar un glacier2router. Esta instancia
debe tener unos endpoints para la parte pública y otros para la parte privada. Esto se consigue con las propiedades:
También es necesario establecer los permisos que se desean para acceder a una sesión glacier. Como primera aproximación lo podemos dejar a Null, sin embargo soporta SSL o archivos de password tipo UNIX.
Glacier2.PermissionsVerifier=Glacier2/NullPermissionsVerifier
Además es imprescindible establecer el default locator del registry que queremos hacer accesible, así como permitir acceder a la sesión de
administración.
Ice.Default.Locator=IceGrid/Locator:tcp -h host -p port Glacier2.SessionManager=IceGrid/AdminSessionManager
También se pueden añadir diversas propiedades para distintos propósitos, por ejemplo podemos establecer timeouts para solventar problemas con conexiones "zombies".
Glacier2.SessionTimeout=60 Glacier2.SessionManager.LocatorCacheTimeout=60
Finalmente queda lanzar el servicio.
glacier2router --Ice.Config=miConfiguracion
A la hora de adaptar las implementaciones para utilizar IceGrid vía Glacier2 en lugar de utilizar directamente IceGrid hay que establecer el router por defecto. Por lo que hay que eliminar la propiedad Ice.Default.Locator y añadir la propiedad Ice.Default.Router con el proxy hacia la parte pública de Glacier2.
También es necesario declarar las propiedades Ice.ACM.Client e Ice.RetryIntervals.
Ice.Default.Router=Glacier2/router:tcp -h host -p port Ice.ACM.Client=0 Ice.RetryIntervals=-1
Con respecto al código es necesario establecer una sesión con el router; una vez establecida todo lo demas funciona de forma transparente (al menos si se utiliza direcionamiento indirecto, con direccionamiento directo no lo he probado).
En python esto tendría la siguiente pinta:
defaultRouter = self.communicator().getDefaultRouter() router = Glacier2.RouterPrx.checkedCast(defaultRouter) router.createSession('usuario', 'password')