Exemplo n.º 1
0
 def init_pyro(self, address, data_dir, capacity, ntp_server):
     """
     Inicializa el método utilizado para exportar las funcionalidades del 
     servidor TagFS a los clientes de la red.
     
     @type address: C{str}
     @param address: Dirección IP de la interfaz donde debe escuchar esta
        instancia del servidor de TagFS.
        
     @type data_dir: C{str}
     @param data_dir: Ruta absoluta al directorio utilizado para almacenar
         los archivos y otros datos relacionados con el funcionamiento
         del servidor.
         
     @type capacity: C{int}
     @param capacity: Capacidad de almacenamiento en bytes de este servidor.
         TagFS garantizará que la capacidad utilizada por todos los
         archivos almacenados en este servidor no sobrepasará esta
         capacidad.
         
     @type ntp_server: C{str}
     @para ntp_server: Host del servidor NTP que se utilizará para obtener
         el tiempo durante el proceso de sincronización de los servidores.
     """
     Pyro.core.initServer()
     self._pyro_remote = Pyro.core.ObjBase()
     self._daemon = Pyro.core.Daemon(host=self._address)
     self._pyro_uri = self._daemon.connect(self._pyro_remote, 'tagfs')
     self._remote = RemoteTagFSServer(address, data_dir, capacity, self._pyro_uri, ntp_server)
     self._pyro_remote.delegateTo(self._remote)
Exemplo n.º 2
0
class TagFSServer(object):
    """
    Servidor de TagFS.
    """
    
    def __init__(self, address, data_dir, capacity, ntp_server=None):
        """
        Inicializa una instancia de un servidor de TagFS.
        
        @type address: C{str}
        @param address: Dirección IP de la interfaz donde debe escuchar esta
           instancia del servidor de TagFS.
           
        @type data_dir: C{str}
        @param data_dir: Ruta absoluta al directorio utilizado para almacenar
            los archivos y otros datos relacionados con el funcionamiento
            del servidor.
            
        @type capacity: C{int}
        @param capacity: Capacidad de almacenamiento en bytes de este servidor.
            TagFS garantizará que la capacidad utilizada por todos los
            archivos almacenados en este servidor no sobrepasará esta
            capacidad.
            
        @type ntp_server: C{str}
        @para ntp_server: Host del servidor NTP que se utilizará para obtener
            el tiempo durante el proceso de sincronización de los servidores.
            Si no se especifica este parámetro el servidor utilizará la hora
            del sistema durante la sincronización.
        """
        self._continue = True
        self._sleep_time = 1
        self._address = address
        self.init_pyro(address, data_dir, capacity, ntp_server)
        self.init_autodiscovery()

    def init_pyro(self, address, data_dir, capacity, ntp_server):
        """
        Inicializa el método utilizado para exportar las funcionalidades del 
        servidor TagFS a los clientes de la red.
        
        @type address: C{str}
        @param address: Dirección IP de la interfaz donde debe escuchar esta
           instancia del servidor de TagFS.
           
        @type data_dir: C{str}
        @param data_dir: Ruta absoluta al directorio utilizado para almacenar
            los archivos y otros datos relacionados con el funcionamiento
            del servidor.
            
        @type capacity: C{int}
        @param capacity: Capacidad de almacenamiento en bytes de este servidor.
            TagFS garantizará que la capacidad utilizada por todos los
            archivos almacenados en este servidor no sobrepasará esta
            capacidad.
            
        @type ntp_server: C{str}
        @para ntp_server: Host del servidor NTP que se utilizará para obtener
            el tiempo durante el proceso de sincronización de los servidores.
        """
        Pyro.core.initServer()
        self._pyro_remote = Pyro.core.ObjBase()
        self._daemon = Pyro.core.Daemon(host=self._address)
        self._pyro_uri = self._daemon.connect(self._pyro_remote, 'tagfs')
        self._remote = RemoteTagFSServer(address, data_dir, capacity, self._pyro_uri, ntp_server)
        self._pyro_remote.delegateTo(self._remote)

    def init_autodiscovery(self):
        """
        Inicializa el descubrimiento automático de los servidores TagFS.
        """
        self._zeroconf = Zeroconf.Zeroconf(self._daemon.hostname)
        zeroconf_service_name = '{n}.{t}'.format(n=self._pyro_uri, t=ZEROCONF_SERVICE_TYPE)
        self._zeroconf_service = Zeroconf.ServiceInfo(ZEROCONF_SERVICE_TYPE, zeroconf_service_name, 
                                                      socket.inet_aton(self._daemon.hostname),
                                                      self._daemon.port, 0, 0, {})
        self._zeroconf.registerService(self._zeroconf_service)

    def start(self):
        """
        Inicia el ciclo principal del servidor TagFS.
        """
        while self._continue:
            try:
                self._daemon.handleRequests(timeout=self._sleep_time)
            except KeyboardInterrupt:
                # End the main loop with CTRL-C.
                self._continue = False
        # Main loop of the daemon exited. Prepare to exit the program.
        self._remote.terminate()
        self._daemon.shutdown()
        self._zeroconf.unregisterService(self._zeroconf_service)
        self._zeroconf.close()

    def stop(self):
        """
        Detiene el ciclo principal del servidor TagFS.
        """
        self._continue = False