def __init__(self, db): self.db = db self.workProvider = WorkProvider(self) self.workers = [] self.web = None self.configCallbacks = {}
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()
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()