diff --git a/bitbake/bin/bitbake b/bitbake/bin/bitbake index fcfe0434ce..ab881c537d 100755 --- a/bitbake/bin/bitbake +++ b/bitbake/bin/bitbake @@ -332,26 +332,29 @@ def main(): server = servermodule.BitBakeXMLRPCClient(configParams.observe_only) server.saveConnectionDetails(configParams.remote_server) + def _getServerConnection(server, featureset): + try: + server_connection = server.establishConnection(featureset) + except Exception as e: + bb.fatal("Could not connect to server %s: %s" % (configParams.remote_server, str(e))) + return server_connection + if not configParams.server_only: if configParams.status_only: - try: - server_connection = server.establishConnection(featureset) - except: - sys.exit(1) - if not server_connection: - sys.exit(1) + server_connection = _getServerConnection(server, featureset) server_connection.terminate() sys.exit(0) # Setup a connection to the server (cooker) - server_connection = server.establishConnection(featureset) - if not server_connection: + try: + server_connection = server.establishConnection(featureset) + except: if configParams.kill_server: - bb.fatal("Server already killed") + bb.fatal("Server already offline") configParams.bind = configParams.remote_server start_server(servermodule, configParams, configuration, featureset) bb.event.ui_queue = [] - server_connection = server.establishConnection(featureset) + server_connection = _getServerConnection(server, featureset) # Restore the environment in case the UI needs it for k in cleanedvars: diff --git a/bitbake/lib/bb/server/xmlrpc.py b/bitbake/lib/bb/server/xmlrpc.py index 6fc5543a80..d6f4338ae5 100644 --- a/bitbake/lib/bb/server/xmlrpc.py +++ b/bitbake/lib/bb/server/xmlrpc.py @@ -80,7 +80,7 @@ class BBTransport(xmlrpclib.Transport): def _create_server(host, port, timeout = 60): t = BBTransport(timeout) - s = xmlrpclib.Server("http://%s:%d/" % (host, port), transport=t, allow_none=True) + s = xmlrpclib.ServerProxy("http://%s:%d/" % (host, port), transport=t, allow_none=True) return s, t class BitBakeServerCommands(): @@ -253,9 +253,13 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): socktimeout = self.socket.gettimeout() or nextsleep socktimeout = min(socktimeout, nextsleep) # Mirror what BaseServer handle_request would do - fd_sets = select.select(fds, [], [], socktimeout) - if fd_sets[0] and self in fd_sets[0]: - self._handle_request_noblock() + try: + fd_sets = select.select(fds, [], [], socktimeout) + if fd_sets[0] and self in fd_sets[0]: + self._handle_request_noblock() + except IOError: + # we ignore interrupted calls + pass # Tell idle functions we're exiting for function, data in self._idlefuns.items(): @@ -346,7 +350,8 @@ class BitBakeXMLRPCClient(BitBakeBaseServer): [host, port] = self.remote.split(":") port = int(port) except Exception as e: - bb.fatal("Failed to read remote definition (%s)" % str(e)) + bb.warn("Failed to read remote definition (%s)" % str(e)) + raise e # We need our IP for the server connection. We get the IP # by trying to connect with the server @@ -356,13 +361,15 @@ class BitBakeXMLRPCClient(BitBakeBaseServer): ip = s.getsockname()[0] s.close() except Exception as e: - bb.fatal("Could not create socket for %s:%s (%s)" % (host, port, str(e))) + bb.warn("Could not create socket for %s:%s (%s)" % (host, port, str(e))) + raise e try: self.serverImpl = XMLRPCProxyServer(host, port) self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0), self.observer_only, featureset) return self.connection.connect() except Exception as e: - bb.fatal("Could not connect to server at %s:%s (%s)" % (host, port, str(e))) + bb.warn("Could not connect to server at %s:%s (%s)" % (host, port, str(e))) + raise e def endSession(self): self.connection.removeClient() diff --git a/bitbake/lib/bb/ui/uievent.py b/bitbake/lib/bb/ui/uievent.py index 98658f68bf..eb760c00c3 100644 --- a/bitbake/lib/bb/ui/uievent.py +++ b/bitbake/lib/bb/ui/uievent.py @@ -47,7 +47,8 @@ class BBUIEventQueue: self.EventHandle = self.BBServer.registerEventHandler(self.host, self.port) if (self.EventHandle == None): - bb.fatal("Could not register UI event handler") + bb.warn("Could not register UI event handler %s:%d" % (self.host, self.port)) + raise Exception("Could not register UI event handler") self.server = server