diff options
author | Alexandru DAMIAN <alexandru.damian@intel.com> | 2013-06-17 12:11:51 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-06-17 16:08:30 +0100 |
commit | 4de9ee21f1fa4d04937cc7430fb1fc8b7a8f61e2 (patch) | |
tree | 47f2564af429444e3338d7f42dd1e4c6bf5d8eb7 /lib/bb/server | |
parent | d48e8bcb24e8fa5d4fd60fd2c9927a95976d8d8b (diff) | |
download | bitbake-4de9ee21f1fa4d04937cc7430fb1fc8b7a8f61e2.tar.gz |
knotty, xmlrpc: add observer-only mode
I add an observer only mode for the knotty UI and
the XMLRPC server that will allow the UI to register
a callback with a server in order to receive events.
The observer-UI is able to send read-only commands to the
server, and also is able to register as an event handler.
Read-only commands are the commands that do not change
the state of the server and have been marked as such in
the command module.
The observer can switch to a full client if it calls addClient
at any time, and the server has no other client running.
Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'lib/bb/server')
-rw-r--r-- | lib/bb/server/xmlrpc.py | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/bb/server/xmlrpc.py b/lib/bb/server/xmlrpc.py index 5045e55ae..026415efd 100644 --- a/lib/bb/server/xmlrpc.py +++ b/lib/bb/server/xmlrpc.py @@ -93,7 +93,7 @@ class BitBakeServerCommands(): """ Run a cooker command on the server """ - return self.cooker.command.runCommand(command) + return self.cooker.command.runCommand(command, self.server.readonly) def terminateServer(self): """ @@ -124,7 +124,7 @@ class BitBakeServerCommands(): # ("service unavailable") is returned to the client. class BitBakeXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): def __init__(self, request, client_address, server): - self.connection_token = server.connection_token + self.server = server SimpleXMLRPCRequestHandler.__init__(self, request, client_address, server) def do_POST(self): @@ -132,9 +132,13 @@ class BitBakeXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): remote_token = self.headers["Bitbake-token"] except: remote_token = None - if remote_token != self.connection_token: + if remote_token != self.server.connection_token and remote_token != "observer": self.report_503() else: + if remote_token == "observer": + self.server.readonly = True + else: + self.server.readonly = False SimpleXMLRPCRequestHandler.do_POST(self) def report_503(self): @@ -283,13 +287,17 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): self.connection_token = token class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): - def __init__(self, serverImpl, clientinfo=("localhost", 0)): + def __init__(self, serverImpl, clientinfo=("localhost", 0), observer_only = False): self.connection, self.transport = _create_server(serverImpl.host, serverImpl.port) self.clientinfo = clientinfo self.serverImpl = serverImpl + self.observer_only = observer_only def connect(self): - token = self.connection.addClient() + if not self.observer_only: + token = self.connection.addClient() + else: + token = "observer" if token is None: return None self.transport.set_connection_token(token) @@ -299,7 +307,8 @@ class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): return self def removeClient(self): - self.connection.removeClient() + if not self.observer_only: + self.connection.removeClient() def terminate(self): # Don't wait for server indefinitely @@ -331,7 +340,8 @@ class BitBakeServer(BitBakeBaseServer): class BitBakeXMLRPCClient(BitBakeBaseServer): - def __init__(self): + def __init__(self, observer_only = False): + self.observer_only = observer_only pass def saveConnectionDetails(self, remote): @@ -354,7 +364,7 @@ class BitBakeXMLRPCClient(BitBakeBaseServer): except: return None self.serverImpl = XMLRPCProxyServer(host, port) - self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0)) + self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0), self.observer_only) return self.connection.connect() def endSession(self): |