예제 #1
0
class EMLUDaemon(GenericDaemon):

    def __init__(self, config):

        # Handle config dict
        conf = default_conf.copy()
        conf.update(config)
        conf['stdout'] = conf['log']
        conf['stderr'] = conf['log']

        super(EMLUDaemon, self).__init__(config)

        # Register functions
        self.server = SimpleJSONRPCServer((self.addr, self.port))
        self.server.register_function(self.get_mounts)
        self.server.register_function(self.mount)
        self.server.register_function(self.umount)

        # Create thread pool
        self.pool = []
        for i in range(conf['pool']):
            th = Thread(target=self.server.serve_forever)
            self.pool.append(th)

        # Create watcher thread
        # FIXME: Implement
        self.watcher = EMLUWatcher()

    #--- Exposed methods -------------------------------------------------------
    def get_mounts(self):
        print('get_mounts()')
        return json.dumps(_get_mounts())

    def mount(self, mp, pwd, timeout):
        print('mount({}, ******)'.format(mp))
        code = _mount(mp, pwd)
        if code == 0:
            self.watch(mp, timeout)
        return code

    def umount(self, mp):
        print('umount({})'.format(mp))
        code = _umount(mp)
        if code == 0:
            self.unwatch(mp)
        return code

    #--- Daemon methods --------------------------------------------------------
    def loop(self):

        print('Starting EMLU server at {}:{}'.format(self.addr, self.port))

        # Start working threads
        for t in self.pool:
            t.start()

        # Block forever
        while True:
            sleep(sys.maxint)

    def terminate(self):

        # Shutdown server (and working threads)
        self.server.shutdow()

        # FIXME: Umount all opened volumes

        # Wait for all threads to finish
        for t in self.pool:
            t.join()