diff options
Diffstat (limited to 'bitbake/lib/bb/server')
| -rw-r--r-- | bitbake/lib/bb/server/__init__.py | 2 | ||||
| -rw-r--r-- | bitbake/lib/bb/server/process.py | 23 | ||||
| -rw-r--r-- | bitbake/lib/bb/server/xmlrpc.py | 29 |
3 files changed, 41 insertions, 13 deletions
diff --git a/bitbake/lib/bb/server/__init__.py b/bitbake/lib/bb/server/__init__.py index 2e1c619b54..da5e480740 100644 --- a/bitbake/lib/bb/server/__init__.py +++ b/bitbake/lib/bb/server/__init__.py | |||
| @@ -89,7 +89,7 @@ class BitBakeBaseServer(object): | |||
| 89 | def detach(self): | 89 | def detach(self): |
| 90 | return | 90 | return |
| 91 | 91 | ||
| 92 | def establishConnection(self): | 92 | def establishConnection(self, featureset): |
| 93 | raise "Must redefine the %s.establishConnection()" % self.__class__.__name__ | 93 | raise "Must redefine the %s.establishConnection()" % self.__class__.__name__ |
| 94 | 94 | ||
| 95 | def endSession(self): | 95 | def endSession(self): |
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index e45e0c2f6d..aa072020af 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
| @@ -31,7 +31,7 @@ import sys | |||
| 31 | import time | 31 | import time |
| 32 | import select | 32 | import select |
| 33 | from Queue import Empty | 33 | from Queue import Empty |
| 34 | from multiprocessing import Event, Process, util, Queue, Pipe, queues | 34 | from multiprocessing import Event, Process, util, Queue, Pipe, queues, Manager |
| 35 | 35 | ||
| 36 | from . import BitBakeBaseServer, BitBakeBaseServerConnection, BaseImplServer | 36 | from . import BitBakeBaseServer, BitBakeBaseServerConnection, BaseImplServer |
| 37 | 37 | ||
| @@ -78,12 +78,13 @@ class ProcessServer(Process, BaseImplServer): | |||
| 78 | profile_filename = "profile.log" | 78 | profile_filename = "profile.log" |
| 79 | profile_processed_filename = "profile.log.processed" | 79 | profile_processed_filename = "profile.log.processed" |
| 80 | 80 | ||
| 81 | def __init__(self, command_channel, event_queue): | 81 | def __init__(self, command_channel, event_queue, featurelist): |
| 82 | BaseImplServer.__init__(self) | 82 | BaseImplServer.__init__(self) |
| 83 | Process.__init__(self) | 83 | Process.__init__(self, args=(featurelist)) |
| 84 | self.command_channel = command_channel | 84 | self.command_channel = command_channel |
| 85 | self.event_queue = event_queue | 85 | self.event_queue = event_queue |
| 86 | self.event = EventAdapter(event_queue) | 86 | self.event = EventAdapter(event_queue) |
| 87 | self.featurelist = featurelist | ||
| 87 | self.quit = False | 88 | self.quit = False |
| 88 | 89 | ||
| 89 | self.keep_running = Event() | 90 | self.keep_running = Event() |
| @@ -94,6 +95,14 @@ class ProcessServer(Process, BaseImplServer): | |||
| 94 | for event in bb.event.ui_queue: | 95 | for event in bb.event.ui_queue: |
| 95 | self.event_queue.put(event) | 96 | self.event_queue.put(event) |
| 96 | self.event_handle.value = bb.event.register_UIHhandler(self) | 97 | self.event_handle.value = bb.event.register_UIHhandler(self) |
| 98 | |||
| 99 | # process any feature changes based on what UI requested | ||
| 100 | original_featureset = list(self.cooker.featureset) | ||
| 101 | while len(self.featurelist)> 0: | ||
| 102 | self.cooker.featureset.setFeature(self.featurelist.pop()) | ||
| 103 | if (original_featureset != list(self.cooker.featureset)): | ||
| 104 | self.cooker.reset() | ||
| 105 | |||
| 97 | bb.cooker.server_main(self.cooker, self.main) | 106 | bb.cooker.server_main(self.cooker, self.main) |
| 98 | 107 | ||
| 99 | def main(self): | 108 | def main(self): |
| @@ -198,13 +207,17 @@ class BitBakeServer(BitBakeBaseServer): | |||
| 198 | # | 207 | # |
| 199 | self.ui_channel, self.server_channel = Pipe() | 208 | self.ui_channel, self.server_channel = Pipe() |
| 200 | self.event_queue = ProcessEventQueue(0) | 209 | self.event_queue = ProcessEventQueue(0) |
| 201 | self.serverImpl = ProcessServer(self.server_channel, self.event_queue) | 210 | manager = Manager() |
| 211 | self.featurelist = manager.list() | ||
| 212 | self.serverImpl = ProcessServer(self.server_channel, self.event_queue, self.featurelist) | ||
| 202 | 213 | ||
| 203 | def detach(self): | 214 | def detach(self): |
| 204 | self.serverImpl.start() | 215 | self.serverImpl.start() |
| 205 | return | 216 | return |
| 206 | 217 | ||
| 207 | def establishConnection(self): | 218 | def establishConnection(self, featureset): |
| 219 | for f in featureset: | ||
| 220 | self.featurelist.append(f) | ||
| 208 | self.connection = BitBakeProcessServerConnection(self.serverImpl, self.ui_channel, self.event_queue) | 221 | self.connection = BitBakeProcessServerConnection(self.serverImpl, self.ui_channel, self.event_queue) |
| 209 | signal.signal(signal.SIGTERM, lambda i, s: self.connection.terminate()) | 222 | signal.signal(signal.SIGTERM, lambda i, s: self.connection.terminate()) |
| 210 | return self.connection | 223 | return self.connection |
diff --git a/bitbake/lib/bb/server/xmlrpc.py b/bitbake/lib/bb/server/xmlrpc.py index 8326623520..389327a60f 100644 --- a/bitbake/lib/bb/server/xmlrpc.py +++ b/bitbake/lib/bb/server/xmlrpc.py | |||
| @@ -89,12 +89,23 @@ class BitBakeServerCommands(): | |||
| 89 | self.server = server | 89 | self.server = server |
| 90 | self.has_client = False | 90 | self.has_client = False |
| 91 | 91 | ||
| 92 | def registerEventHandler(self, host, port): | 92 | def registerEventHandler(self, host, port, featureset = []): |
| 93 | """ | 93 | """ |
| 94 | Register a remote UI Event Handler | 94 | Register a remote UI Event Handler |
| 95 | """ | 95 | """ |
| 96 | s, t = _create_server(host, port) | 96 | s, t = _create_server(host, port) |
| 97 | 97 | ||
| 98 | # we don't allow connections if the cooker is running | ||
| 99 | if (self.cooker.state in [bb.cooker.state.parsing, bb.cooker.state.running]): | ||
| 100 | return None | ||
| 101 | |||
| 102 | original_featureset = list(self.cooker.featureset) | ||
| 103 | for f in featureset: | ||
| 104 | self.cooker.featureset.setFeature(f) | ||
| 105 | |||
| 106 | if (original_featureset != list(self.cooker.featureset)): | ||
| 107 | self.cooker.reset() | ||
| 108 | |||
| 98 | self.event_handle = bb.event.register_UIHhandler(s) | 109 | self.event_handle = bb.event.register_UIHhandler(s) |
| 99 | return self.event_handle | 110 | return self.event_handle |
| 100 | 111 | ||
| @@ -263,11 +274,12 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): | |||
| 263 | self.connection_token = token | 274 | self.connection_token = token |
| 264 | 275 | ||
| 265 | class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): | 276 | class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): |
| 266 | def __init__(self, serverImpl, clientinfo=("localhost", 0), observer_only = False): | 277 | def __init__(self, serverImpl, clientinfo=("localhost", 0), observer_only = False, featureset = []): |
| 267 | self.connection, self.transport = _create_server(serverImpl.host, serverImpl.port) | 278 | self.connection, self.transport = _create_server(serverImpl.host, serverImpl.port) |
| 268 | self.clientinfo = clientinfo | 279 | self.clientinfo = clientinfo |
| 269 | self.serverImpl = serverImpl | 280 | self.serverImpl = serverImpl |
| 270 | self.observer_only = observer_only | 281 | self.observer_only = observer_only |
| 282 | self.featureset = featureset | ||
| 271 | 283 | ||
| 272 | def connect(self): | 284 | def connect(self): |
| 273 | if not self.observer_only: | 285 | if not self.observer_only: |
| @@ -277,7 +289,8 @@ class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): | |||
| 277 | if token is None: | 289 | if token is None: |
| 278 | return None | 290 | return None |
| 279 | self.transport.set_connection_token(token) | 291 | self.transport.set_connection_token(token) |
| 280 | self.events = uievent.BBUIEventQueue(self.connection, self.clientinfo) | 292 | |
| 293 | self.events = uievent.BBUIEventQueue(self.connection, self.clientinfo, self.featureset) | ||
| 281 | for event in bb.event.ui_queue: | 294 | for event in bb.event.ui_queue: |
| 282 | self.events.queue_event(event) | 295 | self.events.queue_event(event) |
| 283 | return self | 296 | return self |
| @@ -301,14 +314,15 @@ class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): | |||
| 301 | 314 | ||
| 302 | class BitBakeServer(BitBakeBaseServer): | 315 | class BitBakeServer(BitBakeBaseServer): |
| 303 | def initServer(self, interface = ("localhost", 0)): | 316 | def initServer(self, interface = ("localhost", 0)): |
| 317 | self.interface = interface | ||
| 304 | self.serverImpl = XMLRPCServer(interface) | 318 | self.serverImpl = XMLRPCServer(interface) |
| 305 | 319 | ||
| 306 | def detach(self): | 320 | def detach(self): |
| 307 | daemonize.createDaemon(self.serverImpl.serve_forever, "bitbake-cookerdaemon.log") | 321 | daemonize.createDaemon(self.serverImpl.serve_forever, "bitbake-cookerdaemon.log") |
| 308 | del self.cooker | 322 | del self.cooker |
| 309 | 323 | ||
| 310 | def establishConnection(self): | 324 | def establishConnection(self, featureset): |
| 311 | self.connection = BitBakeXMLRPCServerConnection(self.serverImpl) | 325 | self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, self.interface, False, featureset) |
| 312 | return self.connection.connect() | 326 | return self.connection.connect() |
| 313 | 327 | ||
| 314 | def set_connection_token(self, token): | 328 | def set_connection_token(self, token): |
| @@ -318,12 +332,13 @@ class BitBakeXMLRPCClient(BitBakeBaseServer): | |||
| 318 | 332 | ||
| 319 | def __init__(self, observer_only = False): | 333 | def __init__(self, observer_only = False): |
| 320 | self.observer_only = observer_only | 334 | self.observer_only = observer_only |
| 335 | # if we need extra caches, just tell the server to load them all | ||
| 321 | pass | 336 | pass |
| 322 | 337 | ||
| 323 | def saveConnectionDetails(self, remote): | 338 | def saveConnectionDetails(self, remote): |
| 324 | self.remote = remote | 339 | self.remote = remote |
| 325 | 340 | ||
| 326 | def establishConnection(self): | 341 | def establishConnection(self, featureset): |
| 327 | # The format of "remote" must be "server:port" | 342 | # The format of "remote" must be "server:port" |
| 328 | try: | 343 | try: |
| 329 | [host, port] = self.remote.split(":") | 344 | [host, port] = self.remote.split(":") |
| @@ -340,7 +355,7 @@ class BitBakeXMLRPCClient(BitBakeBaseServer): | |||
| 340 | except: | 355 | except: |
| 341 | return None | 356 | return None |
| 342 | self.serverImpl = XMLRPCProxyServer(host, port) | 357 | self.serverImpl = XMLRPCProxyServer(host, port) |
| 343 | self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0), self.observer_only) | 358 | self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0), self.observer_only, featureset) |
| 344 | return self.connection.connect() | 359 | return self.connection.connect() |
| 345 | 360 | ||
| 346 | def endSession(self): | 361 | def endSession(self): |
