diff options
Diffstat (limited to 'import-layers/yocto-poky/bitbake/lib/bb/server/xmlrpc.py')
-rw-r--r-- | import-layers/yocto-poky/bitbake/lib/bb/server/xmlrpc.py | 86 |
1 files changed, 59 insertions, 27 deletions
diff --git a/import-layers/yocto-poky/bitbake/lib/bb/server/xmlrpc.py b/import-layers/yocto-poky/bitbake/lib/bb/server/xmlrpc.py index ace1cf646..452f14bb3 100644 --- a/import-layers/yocto-poky/bitbake/lib/bb/server/xmlrpc.py +++ b/import-layers/yocto-poky/bitbake/lib/bb/server/xmlrpc.py @@ -31,31 +31,33 @@ in the server's main loop. """ +import os +import sys + +import hashlib +import time +import socket +import signal +import threading +import pickle +import inspect +import select +import http.client +import xmlrpc.client +from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler + import bb -import xmlrpclib, sys from bb import daemonize from bb.ui import uievent -import hashlib, time -import socket -import os, signal -import threading -try: - import cPickle as pickle -except ImportError: - import pickle +from . import BitBakeBaseServer, BitBakeBaseServerConnection, BaseImplServer DEBUG = False -from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler -import inspect, select, httplib - -from . import BitBakeBaseServer, BitBakeBaseServerConnection, BaseImplServer - -class BBTransport(xmlrpclib.Transport): +class BBTransport(xmlrpc.client.Transport): def __init__(self, timeout): self.timeout = timeout self.connection_token = None - xmlrpclib.Transport.__init__(self) + xmlrpc.client.Transport.__init__(self) # Modified from default to pass timeout to HTTPConnection def make_connection(self, host): @@ -67,7 +69,7 @@ class BBTransport(xmlrpclib.Transport): # create a HTTP connection object from a host descriptor chost, self._extra_headers, x509 = self.get_host_info(host) #store the host argument along with the connection object - self._connection = host, httplib.HTTPConnection(chost, timeout=self.timeout) + self._connection = host, http.client.HTTPConnection(chost, timeout=self.timeout) return self._connection[1] def set_connection_token(self, token): @@ -76,13 +78,30 @@ class BBTransport(xmlrpclib.Transport): def send_content(self, h, body): if self.connection_token: h.putheader("Bitbake-token", self.connection_token) - xmlrpclib.Transport.send_content(self, h, body) + xmlrpc.client.Transport.send_content(self, h, body) def _create_server(host, port, timeout = 60): t = BBTransport(timeout) - s = xmlrpclib.ServerProxy("http://%s:%d/" % (host, port), transport=t, allow_none=True) + s = xmlrpc.client.ServerProxy("http://%s:%d/" % (host, port), transport=t, allow_none=True, use_builtin_types=True) return s, t +def check_connection(remote, timeout): + try: + host, port = remote.split(":") + port = int(port) + except Exception as e: + bb.warn("Failed to read remote definition (%s)" % str(e)) + raise e + + server, _transport = _create_server(host, port, timeout) + try: + ret, err = server.runCommand(['getVariable', 'TOPDIR']) + if err or not ret: + return False + except ConnectionError: + return False + return True + class BitBakeServerCommands(): def __init__(self, server): @@ -128,7 +147,7 @@ class BitBakeServerCommands(): def addClient(self): if self.has_client: return None - token = hashlib.md5(str(time.time())).hexdigest() + token = hashlib.md5(str(time.time()).encode("utf-8")).hexdigest() self.server.set_connection_token(token) self.has_client = True return token @@ -178,7 +197,7 @@ class XMLRPCProxyServer(BaseImplServer): """ not a real working server, but a stub for a proxy server connection """ - def __init__(self, host, port): + def __init__(self, host, port, use_builtin_types=True): self.host = host self.port = port @@ -186,7 +205,7 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): # remove this when you're done with debugging # allow_reuse_address = True - def __init__(self, interface, single_use=False): + def __init__(self, interface, single_use=False, idle_timeout=0): """ Constructor """ @@ -204,6 +223,10 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): self.commands = BitBakeServerCommands(self) self.autoregister_all_functions(self.commands, "") self.interface = interface + self.time = time.time() + self.idle_timeout = idle_timeout + if idle_timeout: + self.register_idle_function(self.handle_idle_timeout, self) def addcooker(self, cooker): BaseImplServer.addcooker(self, cooker) @@ -219,6 +242,12 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): if name.startswith(prefix): self.register_function(method, name[len(prefix):]) + def handle_idle_timeout(self, server, data, abort): + if not abort: + if time.time() - server.time > server.idle_timeout: + server.quit = True + print("Server idle timeout expired") + return [] def serve_forever(self): # Start the actual XMLRPC server @@ -232,7 +261,7 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): while not self.quit: fds = [self] nextsleep = 0.1 - for function, data in self._idlefuns.items(): + for function, data in list(self._idlefuns.items()): retval = None try: retval = function(self, data, False) @@ -261,13 +290,15 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): try: fd_sets = select.select(fds, [], [], socktimeout) if fd_sets[0] and self in fd_sets[0]: + if self.idle_timeout: + self.time = time.time() self._handle_request_noblock() except IOError: # we ignore interrupted calls pass # Tell idle functions we're exiting - for function, data in self._idlefuns.items(): + for function, data in list(self._idlefuns.items()): try: retval = function(self, data, True) except: @@ -332,9 +363,10 @@ class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): pass class BitBakeServer(BitBakeBaseServer): - def initServer(self, interface = ("localhost", 0), single_use = False): + def initServer(self, interface = ("localhost", 0), + single_use = False, idle_timeout=0): self.interface = interface - self.serverImpl = XMLRPCServer(interface, single_use) + self.serverImpl = XMLRPCServer(interface, single_use, idle_timeout) def detach(self): daemonize.createDaemon(self.serverImpl.serve_forever, "bitbake-cookerdaemon.log") @@ -379,7 +411,7 @@ class BitBakeXMLRPCClient(BitBakeBaseServer): bb.warn("Could not create socket for %s:%s (%s)" % (host, port, str(e))) raise e try: - self.serverImpl = XMLRPCProxyServer(host, port) + self.serverImpl = XMLRPCProxyServer(host, port, use_builtin_types=True) self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0), self.observer_only, featureset) return self.connection.connect(self.token) except Exception as e: |