Example #1
0
 def __init__(self, db):
     self.db = db
     self.workProvider = WorkProvider(self)
     self.workers = []
     self.web = None
     self.configCallbacks = {}
Example #2
0
 def __init__(self, db):
     self.db = db
     self.workProvider = WorkProvider(self)
     self.workers = []
     self.web = None
     self.configCallbacks = {}
Example #3
0
class ClusterServer(Factory):
    """ClusterServer is the root class for the server.
    
    It maintains the database and listens for incoming connections.
    """

    protocol = WorkerConnection

    versionNumber = (1, 45)

    def __init__(self, db):
        self.db = db
        self.workProvider = WorkProvider(self)
        self.workers = []
        self.web = None
        self.configCallbacks = {}

    def getConfig(self, var, type=str, default=None, callback=None):
        """Reads a configuration variable out of the database.
        
        Will attempt to convert it into the specified type. If the variable
        is not found, or type conversion fails, returns the default.
        """
        # Take care of the callback first, before encountering any returns...
        if callable(callback):
            callbacks = self.configCallbacks.setdefault(var, [])
            if callback not in callbacks:
                callbacks.append(callback)

        # This should only loop once.
        for value, in self.db.execute(
                'SELECT value FROM config WHERE var=? '
                'LIMIT 1;', (var, )):
            try:
                value = type(value)
            except (TypeError, ValueError):
                return default
            else:
                return value  # Type-converted

        # Variable is not present in the database.
        return default

    def getAllConfig(self):
        """Retrieves all configuration values from the database."""
        config = {}
        for var, value in self.db.execute('SELECT var, value FROM config;'):
            config[var] = value
        return config

    def setConfig(self, var, value):
        """Writes a configuration variable to the database.
        
        The value is type-converted to a string for storage.
        """
        # There might be an old definition, so take it out if so.
        self.db.execute('DELETE FROM config WHERE var=?;', (var, ))
        if value is not None:  # Setting to None means the variable gets cleared.
            self.db.execute('INSERT INTO config (var,value) VALUES (?,?);',
                            (var, str(value)))

        # Now inform any waiting callbacks...
        for callback in self.configCallbacks.get(var, []):
            callback()

    def listAccountConnections(self, username):
        """List every connected, logged-in worker using the specified username.
        The username is case-sensitive.
        """
        return filter(lambda x: x.account and x.account.username == username,
                      self.workers)

    def getConnection(self, sessionno):
        """Gets a connection by its session ID."""
        for w in self.workers:
            if w.transport.sessionno == sessionno:
                return w

    def start(self):
        """Sets up the server to listen on a port and starts all subsystems."""
        port = self.getConfig('server_port', int, 8880)
        ip = self.getConfig('server_ip', str, '')
        reactor.listenTCP(port, self, interface=ip)

        self.web = WebServer(self)
        self.web.start()

        self.workProvider.start()
Example #4
0
class ClusterServer(Factory):
    """ClusterServer is the root class for the server.
    
    It maintains the database and listens for incoming connections.
    """

    protocol = WorkerConnection

    versionNumber = (1, 45)

    def __init__(self, db):
        self.db = db
        self.workProvider = WorkProvider(self)
        self.workers = []
        self.web = None
        self.configCallbacks = {}

    def getConfig(self, var, type=str, default=None, callback=None):
        """Reads a configuration variable out of the database.
        
        Will attempt to convert it into the specified type. If the variable
        is not found, or type conversion fails, returns the default.
        """
        # Take care of the callback first, before encountering any returns...
        if callable(callback):
            callbacks = self.configCallbacks.setdefault(var, [])
            if callback not in callbacks:
                callbacks.append(callback)

        # This should only loop once.
        for (value,) in self.db.execute("SELECT value FROM config WHERE var=? " "LIMIT 1;", (var,)):
            try:
                value = type(value)
            except (TypeError, ValueError):
                return default
            else:
                return value  # Type-converted

        # Variable is not present in the database.
        return default

    def getAllConfig(self):
        """Retrieves all configuration values from the database."""
        config = {}
        for var, value in self.db.execute("SELECT var, value FROM config;"):
            config[var] = value
        return config

    def setConfig(self, var, value):
        """Writes a configuration variable to the database.
        
        The value is type-converted to a string for storage.
        """
        # There might be an old definition, so take it out if so.
        self.db.execute("DELETE FROM config WHERE var=?;", (var,))
        if value is not None:  # Setting to None means the variable gets cleared.
            self.db.execute("INSERT INTO config (var,value) VALUES (?,?);", (var, str(value)))

        # Now inform any waiting callbacks...
        for callback in self.configCallbacks.get(var, []):
            callback()

    def listAccountConnections(self, username):
        """List every connected, logged-in worker using the specified username.
        The username is case-sensitive.
        """
        return filter(lambda x: x.account and x.account.username == username, self.workers)

    def getConnection(self, sessionno):
        """Gets a connection by its session ID."""
        for w in self.workers:
            if w.transport.sessionno == sessionno:
                return w

    def start(self):
        """Sets up the server to listen on a port and starts all subsystems."""
        port = self.getConfig("server_port", int, 8880)
        ip = self.getConfig("server_ip", str, "")
        reactor.listenTCP(port, self, interface=ip)

        self.web = WebServer(self)
        self.web.start()

        self.workProvider.start()